blob: fd67a298fd2bbe32b7315753b9f002ccb5592c58 [file] [log] [blame]
Index: lucene/CHANGES.txt
===================================================================
--- lucene/CHANGES.txt (revision 1071187)
+++ lucene/CHANGES.txt (working copy)
@@ -1,3 +1,11 @@
+This version removed the previous PatchedFrameOfRef4, PatchedFrameOfRef5 and PatchedFrameOfRef6. And added a new PatchedFrameOfRef4, which is faster then them.
+
+Based on the current performance tests, PatchedFrameOfRef4 is faster than BulkVInt and comparable to PatchedFrameOfRef.
+
+PatchedFrameOfRef4 uses the IntBuffer as to save int[]<->byte[] conversions.
+It also hardcodes the decompression(with the Unpack128WithBuffer class). It also contains some other optimizations.
+
+The detailed experimental results can be found at: https://issues.apache.org/jira/browse/LUCENE-2903?focusedCommentId=12992687#comment-12992687
Lucene Change Log
======================= Trunk (not yet released) =======================
Index: lucene/src/test/org/apache/lucene/index/codecs/pfordelta2/TestPForDelta2.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/codecs/pfordelta2/TestPForDelta2.java (revision 1071187)
+++ lucene/src/test/org/apache/lucene/index/codecs/pfordelta2/TestPForDelta2.java (working copy)
@@ -1,96 +0,0 @@
-package org.apache.lucene.index.codecs.pfordelta2;
-
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.apache.lucene.index.BulkPostingsEnum;
-import org.apache.lucene.index.codecs.sep.*;
-import org.apache.lucene.store.*;
-import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util._TestUtil;
-
-import org.junit.Ignore;
-
-/**
- * This class is to test the PForDeltaFixedIntBlockCodec
- *
- *
- */
-
-public class TestPForDelta2 extends LuceneTestCase {
-
- @Ignore("doens't pass yet")
- public void testRandomInts() throws Exception {
- // nocommit mix up block size too once pfor1 supports it
- int blockSize = 128;
- IntStreamFactory f = new PForDeltaFixedIntBlockCodec(blockSize).getIntFactory();
- for(int iter=0;iter<10*RANDOM_MULTIPLIER;iter++) {
- Directory dir = newDirectory();
- int testDataSize = _TestUtil.nextInt(random, 10000, 100000);
- int[] testData = new int[testDataSize];
- for(int i=0; i<testDataSize; ++i) {
- // nocommit -- do a better job here -- pick
- // numFrameBits, numExceptions, hten gen according
- // to that
- testData[i] = random.nextInt() & Integer.MAX_VALUE;
- }
-
- IntIndexOutput out = f.createOutput(dir, "test");
- for(int i=0;i<testDataSize;i++) {
- out.write(testData[i]);
- }
- out.close();
-
- IntIndexInput in = f.openInput(dir, "test");
- BulkPostingsEnum.BlockReader r = in.reader();
- final int[] buffer = r.getBuffer();
- int pointer = 0;
- int pointerMax = r.fill();
- assertTrue(pointerMax > 0);
-
- for(int i=0;i<testDataSize;i++) {
- if (pointer == pointerMax) {
- pointerMax = r.fill();
- assertTrue(pointerMax > 0);
- pointer = 0;
- }
- final int expected = testData[i];
- final int actual = buffer[pointer++];
- assertEquals(actual + " != " + expected, expected, actual);
- }
- in.close();
- dir.close();
- }
- }
-
- public void testEmpty() throws Exception {
- Directory dir = newDirectory();
- int blockSize = 128;
- IntStreamFactory f = new PForDeltaFixedIntBlockCodec(blockSize).getIntFactory();
- IntIndexOutput out = f.createOutput(dir, "test");
-
- // write no ints
- out.close();
-
- IntIndexInput in = f.openInput(dir, "test");
- in.reader();
- // read no ints
- in.close();
- dir.close();
- }
-}
-
Index: lucene/src/test/org/apache/lucene/index/codecs/pfordelta2/TestPForDeltaFixedIntBlockWithIntBufferCodec.java
===================================================================
--- lucene/src/test/org/apache/lucene/index/codecs/pfordelta2/TestPForDeltaFixedIntBlockWithIntBufferCodec.java (revision 0)
+++ lucene/src/test/org/apache/lucene/index/codecs/pfordelta2/TestPForDeltaFixedIntBlockWithIntBufferCodec.java (revision 0)
@@ -0,0 +1,95 @@
+package org.apache.lucene.index.codecs.pfordelta2;
+
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.lucene.index.BulkPostingsEnum;
+import org.apache.lucene.index.codecs.sep.*;
+import org.apache.lucene.store.*;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util._TestUtil;
+
+/**
+ * This class is to test the PForDeltaFixedIntBlockCodec
+ *
+ *
+ */
+
+public class TestPForDeltaFixedIntBlockWithIntBufferCodec extends LuceneTestCase {
+
+ public void testRandomInts() throws Exception {
+ System.out.println("test int buffer");
+ // nocommit mix up block size too once pfor1 supports it
+ int blockSize = 128;
+ IntStreamFactory f = new PForDeltaFixedIntBlockWithIntBufferFactory(blockSize);
+ for(int iter=0;iter<10*RANDOM_MULTIPLIER;iter++) {
+ Directory dir = newDirectory();
+ int testDataSize = _TestUtil.nextInt(random, 10000, 100000);
+ int[] testData = new int[testDataSize];
+
+ for(int i=0; i<testDataSize; ++i) {
+ // nocommit -- do a better job here -- pick
+ // numFrameBits, numExceptions, hten gen according
+ // to that
+ testData[i] = random.nextInt() & Integer.MAX_VALUE;
+ }
+
+ IntIndexOutput out = f.createOutput(dir, "test");
+ for(int i=0;i<testDataSize;i++) {
+ out.write(testData[i]);
+ }
+ out.close();
+
+ IntIndexInput in = f.openInput(dir, "test");
+ BulkPostingsEnum.BlockReader r = in.reader();
+ final int[] buffer = r.getBuffer();
+ int pointer = 0;
+ int pointerMax = r.fill();
+ assertTrue(pointerMax > 0);
+
+ for(int i=0;i<testDataSize;i++) {
+ assertEquals(testData[i], buffer[pointer++]);
+ if (pointer == pointerMax) {
+ pointerMax = r.fill();
+ assertTrue(pointerMax > 0);
+ pointer = 0;
+ }
+ }
+ in.close();
+ dir.close();
+ }
+ }
+
+ public void testEmpty() throws Exception {
+ Directory dir = newDirectory();
+ int blockSize = 128;
+ IntStreamFactory f = new PForDeltaFixedIntBlockWithIntBufferFactory(blockSize);
+ IntIndexOutput out = f.createOutput(dir, "test");
+
+ // write no ints
+ out.close();
+
+ IntIndexInput in = f.openInput(dir, "test");
+ in.reader();
+ // read no ints
+ in.close();
+ dir.close();
+ }
+}
+
+
Property changes on: lucene/src/test/org/apache/lucene/index/codecs/pfordelta2/TestPForDeltaFixedIntBlockWithIntBufferCodec.java
___________________________________________________________________
Added: svn:eol-style
+ native
Index: lucene/src/java/org/apache/lucene/index/codecs/CoreCodecProvider.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/CoreCodecProvider.java (revision 1071187)
+++ lucene/src/java/org/apache/lucene/index/codecs/CoreCodecProvider.java (working copy)
@@ -20,7 +20,7 @@
import org.apache.lucene.index.codecs.bulkvint.BulkVIntCodec;
import org.apache.lucene.index.codecs.pfordelta.FrameOfRefCodec;
import org.apache.lucene.index.codecs.pfordelta.PatchedFrameOfRefCodec;
-import org.apache.lucene.index.codecs.pfordelta2.PForDeltaFixedIntBlockCodec;
+import org.apache.lucene.index.codecs.pfordelta2.PForDeltaFixedIntBlockWithIntBufferCodec;
import org.apache.lucene.index.codecs.preflex.PreFlexCodec;
import org.apache.lucene.index.codecs.pulsing.PulsingCodec;
import org.apache.lucene.index.codecs.simple64.Simple64Codec;
@@ -52,7 +52,7 @@
register(new SimpleTextCodec());
register(new PatchedFrameOfRefCodec());
register(new FrameOfRefCodec());
- register(new PForDeltaFixedIntBlockCodec(128));
+ register(new PForDeltaFixedIntBlockWithIntBufferCodec(128)); // patchedFrameOfRef6
register(new BulkVIntCodec(128));
register(new Simple64Codec(4));
}
Index: lucene/src/java/org/apache/lucene/index/codecs/bulkvint/BulkVIntCodec.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/bulkvint/BulkVIntCodec.java (revision 1071187)
+++ lucene/src/java/org/apache/lucene/index/codecs/bulkvint/BulkVIntCodec.java (working copy)
@@ -28,8 +28,6 @@
import org.apache.lucene.index.codecs.FieldsConsumer;
import org.apache.lucene.index.codecs.FieldsProducer;
import org.apache.lucene.index.codecs.fixed.FixedIntStreamFactory;
-import org.apache.lucene.index.codecs.fixed.FixedPostingsReaderImpl;
-import org.apache.lucene.index.codecs.fixed.FixedPostingsWriterImpl;
import org.apache.lucene.index.codecs.intblock.FixedIntBlockIndexInput;
import org.apache.lucene.index.codecs.intblock.FixedIntBlockIndexOutput;
import org.apache.lucene.index.codecs.PostingsWriterBase;
@@ -40,6 +38,8 @@
import org.apache.lucene.index.codecs.BlockTermsReader;
import org.apache.lucene.index.codecs.VariableGapTermsIndexReader;
import org.apache.lucene.index.codecs.VariableGapTermsIndexWriter;
+import org.apache.lucene.index.codecs.sep.SepPostingsReaderImpl;
+import org.apache.lucene.index.codecs.sep.SepPostingsWriterImpl;
import org.apache.lucene.index.codecs.standard.StandardCodec;
import org.apache.lucene.store.*;
import org.apache.lucene.util.BytesRef;
@@ -152,7 +152,7 @@
@Override
public FieldsConsumer fieldsConsumer(SegmentWriteState state) throws IOException {
- PostingsWriterBase postingsWriter = new FixedPostingsWriterImpl(state, new BulkVIntFactory());
+ PostingsWriterBase postingsWriter = new SepPostingsWriterImpl(state, new BulkVIntFactory());
boolean success = false;
TermsIndexWriterBase indexWriter;
@@ -183,7 +183,7 @@
@Override
public FieldsProducer fieldsProducer(SegmentReadState state) throws IOException {
- PostingsReaderBase postingsReader = new FixedPostingsReaderImpl(state.dir,
+ PostingsReaderBase postingsReader = new SepPostingsReaderImpl(state.dir,
state.segmentInfo,
state.readBufferSize,
new BulkVIntFactory(), state.codecId);
@@ -229,14 +229,14 @@
@Override
public void files(Directory dir, SegmentInfo segmentInfo, String codecId, Set<String> files) {
- FixedPostingsReaderImpl.files(segmentInfo, codecId, files);
+ SepPostingsReaderImpl.files(segmentInfo, codecId, files);
BlockTermsReader.files(dir, segmentInfo, codecId, files);
VariableGapTermsIndexReader.files(dir, segmentInfo, codecId, files);
}
@Override
public void getExtensions(Set<String> extensions) {
- FixedPostingsWriterImpl.getExtensions(extensions);
+ SepPostingsWriterImpl.getExtensions(extensions);
BlockTermsReader.getExtensions(extensions);
VariableGapTermsIndexReader.getIndexExtensions(extensions);
}
Index: lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferFactory.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferFactory.java (revision 0)
+++ lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferFactory.java (revision 0)
@@ -0,0 +1,46 @@
+package org.apache.lucene.index.codecs.pfordelta2;
+
+
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.index.codecs.sep.IntStreamFactory;
+import org.apache.lucene.index.codecs.sep.IntIndexInput;
+import org.apache.lucene.index.codecs.sep.IntIndexOutput;
+
+import java.io.IOException;
+
+public class PForDeltaFixedIntBlockWithIntBufferFactory extends IntStreamFactory {
+ private final int blockSize;
+
+ /** blockSize is only used when creating the
+ * IntIndexOutput */
+ public PForDeltaFixedIntBlockWithIntBufferFactory(int blockSize) {
+ this.blockSize = blockSize;
+ }
+
+ public IntIndexInput openInput(Directory dir, String fileName, int readBufferSize) throws IOException {
+ return new PForDeltaFixedIntBlockWithIntBufferIndexInput(dir, fileName, readBufferSize);
+ }
+
+
+ public IntIndexOutput createOutput(Directory dir, String fileName) throws IOException {
+ return new PForDeltaFixedIntBlockWithIntBufferIndexOutput(dir, fileName, blockSize);
+ }
+}
\ No newline at end of file
Property changes on: lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferFactory.java
___________________________________________________________________
Added: svn:eol-style
+ native
Index: lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferIndexInput.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferIndexInput.java (revision 0)
+++ lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferIndexInput.java (revision 0)
@@ -0,0 +1,89 @@
+package org.apache.lucene.index.codecs.pfordelta2;
+
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.IndexInput;
+import org.apache.lucene.util.pfor2.LCPForDelta;
+import org.apache.lucene.index.codecs.intblock.FixedIntBlockIndexInput;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+
+public class PForDeltaFixedIntBlockWithIntBufferIndexInput extends FixedIntBlockIndexInput {
+
+ public PForDeltaFixedIntBlockWithIntBufferIndexInput(Directory dir, String fileName, int readBufferSize) throws IOException {
+ super(dir.openInput(fileName, readBufferSize));
+
+ }
+
+ private static class BlockReader implements FixedIntBlockIndexInput.BlockReader {
+ private final LCPForDelta decompressor;
+ private final IndexInput input;
+ private final int[] decompBlock;
+
+ private final ByteBuffer byteCompBuffer;
+ private final IntBuffer intCompBuffer;
+ private final byte[] byteCompBlock;
+ private final int[] expPosIntBlock;
+ private final int[] expHighBitIntBlock;
+
+ private static final int MAX_BLOCK_SIZE = 128;
+
+ public BlockReader(IndexInput in, int[] buffer) {
+ decompressor = new LCPForDelta();
+ input = in;
+ decompBlock = buffer;
+
+ byteCompBuffer = ByteBuffer.allocate(MAX_BLOCK_SIZE*4*4);
+ byteCompBlock = byteCompBuffer.array();
+ intCompBuffer = byteCompBuffer.asIntBuffer();
+
+ expPosIntBlock = new int[MAX_BLOCK_SIZE];
+ expHighBitIntBlock = new int[MAX_BLOCK_SIZE];
+ }
+
+ public void seek(long pos) throws IOException {
+ //
+ }
+
+ public void readBlock() throws IOException {
+
+ // read the compressed data
+ final int compressedSizeInInt = input.readInt();
+
+ int blockSize = 128;
+ input.readBytes(byteCompBlock, 0, compressedSizeInInt*4);
+ intCompBuffer.rewind();
+
+ decompressor.decompressOneBlockWithSizeWithIntBuffer(decompBlock, intCompBuffer, blockSize, expPosIntBlock, expHighBitIntBlock, compressedSizeInInt);
+ }
+
+ public void skipBlock() throws IOException {
+ int numInts = input.readInt(); // nocommit: should PFOR use vint header?
+ input.seek(input.getFilePointer() + numInts*4); // seek past block
+ }
+ }
+
+ protected BlockReader getBlockReader(IndexInput in, int[] buffer) {
+ return new BlockReader(in, buffer);
+ }
+}
+
Property changes on: lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferIndexInput.java
___________________________________________________________________
Added: svn:eol-style
+ native
Index: lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferIndexOutput.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferIndexOutput.java (revision 0)
+++ lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferIndexOutput.java (revision 0)
@@ -0,0 +1,54 @@
+package org.apache.lucene.index.codecs.pfordelta2;
+
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.lucene.index.codecs.intblock.FixedIntBlockIndexOutput;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.pfor2.LCPForDelta;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+
+public class PForDeltaFixedIntBlockWithIntBufferIndexOutput extends FixedIntBlockIndexOutput {
+ private final LCPForDelta compressor;
+ private final int blockSize;
+ public PForDeltaFixedIntBlockWithIntBufferIndexOutput(Directory dir, String fileName, int blockSize) throws IOException {
+ super(dir.createOutput(fileName), blockSize);
+ this.blockSize = blockSize;
+ compressor = new LCPForDelta();
+ }
+
+ @Override
+ protected void flushBlock() throws IOException {
+ int compressedSizeInInts = compressor.compress(buffer, blockSize);
+ // write out the compressed size in ints
+ out.writeInt(compressedSizeInInts);
+
+ int[] compBlock = compressor.getCompBuffer();
+ ByteBuffer byteCompBuffer = ByteBuffer.allocate(compressedSizeInInts*4);
+ byte[] byteCompBlock = byteCompBuffer.array();
+ IntBuffer intCompBuffer = byteCompBuffer.asIntBuffer();
+ intCompBuffer.put(compBlock, 0, compressedSizeInInts);
+
+ out.writeBytes(byteCompBlock, byteCompBlock.length);
+ compressor.setCompBuffer(null);
+ }
+}
+
+
Property changes on: lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferIndexOutput.java
___________________________________________________________________
Added: svn:eol-style
+ native
Index: lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockCodec.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockCodec.java (revision 1071187)
+++ lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockCodec.java (working copy)
@@ -1,259 +0,0 @@
-package org.apache.lucene.index.codecs.pfordelta2;
-
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-import java.io.IOException;
-import java.util.Set;
-
-import org.apache.lucene.index.SegmentInfo;
-import org.apache.lucene.index.SegmentWriteState;
-import org.apache.lucene.index.SegmentReadState;
-import org.apache.lucene.index.codecs.Codec;
-import org.apache.lucene.index.codecs.FieldsConsumer;
-import org.apache.lucene.index.codecs.FieldsProducer;
-import org.apache.lucene.index.codecs.fixed.FixedIntStreamFactory;
-import org.apache.lucene.index.codecs.fixed.FixedPostingsReaderImpl;
-import org.apache.lucene.index.codecs.fixed.FixedPostingsWriterImpl;
-import org.apache.lucene.index.codecs.intblock.FixedIntBlockIndexInput;
-import org.apache.lucene.index.codecs.intblock.FixedIntBlockIndexOutput;
-import org.apache.lucene.index.codecs.PostingsWriterBase;
-import org.apache.lucene.index.codecs.PostingsReaderBase;
-import org.apache.lucene.index.codecs.BlockTermsReader;
-import org.apache.lucene.index.codecs.BlockTermsWriter;
-import org.apache.lucene.index.codecs.TermsIndexReaderBase;
-import org.apache.lucene.index.codecs.TermsIndexWriterBase;
-import org.apache.lucene.index.codecs.VariableGapTermsIndexReader;
-import org.apache.lucene.index.codecs.VariableGapTermsIndexWriter;
-import org.apache.lucene.index.codecs.sep.IntStreamFactory;
-import org.apache.lucene.index.codecs.standard.StandardCodec;
-import org.apache.lucene.store.*;
-import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.pfor2.PForDelta;
-
-/**
- * A codec for fixed sized int block encoders. The int encoder
- * used here writes each block as data encoded by PForDelta.
- */
-
-public class PForDeltaFixedIntBlockCodec extends Codec {
-
- private final int blockSize;
-
- public PForDeltaFixedIntBlockCodec(int blockSize) {
- this.blockSize = blockSize;
- name = "PatchedFrameOfRef2";
- }
-
- @Override
- public String toString() {
- return name + "(blockSize=" + blockSize + ")";
- }
-
- /**
- * Encode a block of integers using PForDelta and
- * @param block the input block to be compressed
- * @param elementNum the number of elements in the block to be compressed
- * @return the compressed size in the number of integers of the compressed data
- * @throws Exception
- */
- int[] encodeOneBlockWithPForDelta(final int[] block, int elementNum) // throws Exception
- {
- assert block != null && block.length > 0;
- /*
- if(block == null || block.length == 0)
- {
- throw new Exception("input block is empty");
- }
- */
-
- final int[] compressedBlock = PForDelta.compressOneBlock(block, elementNum);
- assert compressedBlock != null;
-
- //if(compressedBlock == null)
- //{
- //throw new Exception("compressed buffer is null");
- //}
- return compressedBlock;
- }
-
- /**
- * Decode a block of compressed data (using PForDelta) into a block of elementNum uncompressed integers
- * @param block the input block to be decompressed
- * @param elementNum the number of elements in the block to be compressed
- */
- void decodeOneBlockWithPForDelta(final int[] block, int elementNum, final int[] output)
- {
- int[] decompressedBlock = PForDelta.decompressOneBlock(block, elementNum);
- System.arraycopy(decompressedBlock, 0, output, 0, decompressedBlock.length);
- }
-
-
- public IntStreamFactory getIntFactory() {
- return new PForDeltaIntFactory();
- }
-
- private class PForDeltaIntFactory extends FixedIntStreamFactory {
-
- @Override
- public FixedIntBlockIndexInput openInput(IndexInput in, String filename, boolean isChild) throws IOException {
- return new FixedIntBlockIndexInput(in) {
-
- @Override
- protected BlockReader getBlockReader(final IndexInput in, final int[] buffer) throws IOException {
- return new BlockReader() {
- // nocommit fixed size:
- private final int[] compressedData = new int[256];
- public void seek(long pos) {}
- public void readBlock() throws IOException {
- if(buffer != null)
- {
- // retrieve the compressed size in ints
- final int compressedSizeInInt = in.readInt();
- // read the compressed data (compressedSizeInInt ints)
- for(int i=0;i<compressedSizeInInt;i++) {
- compressedData[i] = in.readInt();
- }
- // decompress the block
- decodeOneBlockWithPForDelta(compressedData, blockSize, buffer);
- }
- }
-
- public void skipBlock() throws IOException {
- final int compressedSizeInInt = in.readInt(); // nocommit: should vint header be used?
- in.seek(in.getFilePointer() + (compressedSizeInInt * 4)); // seek past block
- }
- };
- }
- };
- }
-
- @Override
- public FixedIntBlockIndexOutput createOutput(IndexOutput out, String fileName, boolean isChild) throws IOException {
- return new FixedIntBlockIndexOutput(out, blockSize) {
- @Override
- protected void flushBlock() throws IOException {
- int compressedSizeInInts = 0;
- // compress the data
- //try {
- final int[] compressedBuffer = encodeOneBlockWithPForDelta(buffer, blockSize);
- //catch(Exception e) {
- //e.printStackTrace();
- //}
- // write out the compressed size in ints
- out.writeInt(compressedBuffer.length);
- // write out the compressed data
- for(int i=0;i<compressedBuffer.length;i++) {
- out.writeInt(compressedBuffer[i]);
- }
- }
- };
- }
- }
-
- @Override
- public FieldsConsumer fieldsConsumer(SegmentWriteState state) throws IOException {
- PostingsWriterBase postingsWriter = new FixedPostingsWriterImpl(state, new PForDeltaIntFactory());
-
- boolean success = false;
- TermsIndexWriterBase indexWriter;
- try {
- indexWriter = new VariableGapTermsIndexWriter(state, new VariableGapTermsIndexWriter.EveryNTermSelector(state.termIndexInterval));
- success = true;
- } finally {
- if (!success) {
- postingsWriter.close();
- }
- }
-
- success = false;
- try {
- FieldsConsumer ret = new BlockTermsWriter(indexWriter, state, postingsWriter, BytesRef.getUTF8SortedAsUnicodeComparator());
- success = true;
- return ret;
- } finally {
- if (!success) {
- try {
- postingsWriter.close();
- } finally {
- indexWriter.close();
- }
- }
- }
- }
-
- @Override
- public FieldsProducer fieldsProducer(SegmentReadState state) throws IOException {
- PostingsReaderBase postingsReader = new FixedPostingsReaderImpl(state.dir,
- state.segmentInfo,
- state.readBufferSize,
- new PForDeltaIntFactory(), state.codecId);
-
- TermsIndexReaderBase indexReader;
- boolean success = false;
- try {
- indexReader = new VariableGapTermsIndexReader(state.dir,
- state.fieldInfos,
- state.segmentInfo.name,
- state.termsIndexDivisor,
- state.codecId);
- success = true;
- } finally {
- if (!success) {
- postingsReader.close();
- }
- }
-
- success = false;
- try {
- FieldsProducer ret = new BlockTermsReader(indexReader,
- state.dir,
- state.fieldInfos,
- state.segmentInfo.name,
- postingsReader,
- state.readBufferSize,
- BytesRef.getUTF8SortedAsUnicodeComparator(),
- StandardCodec.TERMS_CACHE_SIZE,
- state.codecId);
- success = true;
- return ret;
- } finally {
- if (!success) {
- try {
- postingsReader.close();
- } finally {
- indexReader.close();
- }
- }
- }
- }
-
- @Override
- public void files(Directory dir, SegmentInfo segmentInfo, String codecId, Set<String> files) {
- FixedPostingsReaderImpl.files(segmentInfo, codecId, files);
- BlockTermsReader.files(dir, segmentInfo, codecId, files);
- VariableGapTermsIndexReader.files(dir, segmentInfo, codecId, files);
- }
-
- @Override
- public void getExtensions(Set<String> extensions) {
- FixedPostingsWriterImpl.getExtensions(extensions);
- BlockTermsReader.getExtensions(extensions);
- VariableGapTermsIndexReader.getIndexExtensions(extensions);
- }
-}
Index: lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferCodec.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferCodec.java (revision 0)
+++ lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferCodec.java (revision 0)
@@ -0,0 +1,157 @@
+package org.apache.lucene.index.codecs.pfordelta2;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import java.io.IOException;
+import java.util.Set;
+
+import org.apache.lucene.index.SegmentInfo;
+import org.apache.lucene.index.SegmentWriteState;
+import org.apache.lucene.index.SegmentReadState;
+import org.apache.lucene.index.codecs.Codec;
+import org.apache.lucene.index.codecs.FieldsConsumer;
+import org.apache.lucene.index.codecs.FieldsProducer;
+import org.apache.lucene.index.codecs.sep.SepPostingsReaderImpl;
+import org.apache.lucene.index.codecs.sep.SepPostingsWriterImpl;
+import org.apache.lucene.index.codecs.VariableGapTermsIndexReader;
+import org.apache.lucene.index.codecs.VariableGapTermsIndexWriter;
+import org.apache.lucene.index.codecs.PostingsWriterBase;
+import org.apache.lucene.index.codecs.PostingsReaderBase;
+import org.apache.lucene.index.codecs.BlockTermsReader;
+import org.apache.lucene.index.codecs.BlockTermsWriter;
+import org.apache.lucene.index.codecs.TermsIndexReaderBase;
+import org.apache.lucene.index.codecs.TermsIndexWriterBase;
+import org.apache.lucene.index.codecs.standard.StandardCodec;
+import org.apache.lucene.store.*;
+import org.apache.lucene.util.BytesRef;
+
+
+
+/**
+ * A codec for fixed sized int block encoders. The int encoder
+ * used here writes each block as data encoded by PForDelta.
+ */
+
+public class PForDeltaFixedIntBlockWithIntBufferCodec extends Codec {
+
+ private final int blockSize;
+
+ public PForDeltaFixedIntBlockWithIntBufferCodec(int blockSize) {
+ this.blockSize = blockSize;
+ name = "PatchedFrameOfRef4";
+ }
+
+ @Override
+ public String toString() {
+ return name + "(blockSize=" + blockSize + ")";
+ }
+
+
+ @Override
+ public FieldsConsumer fieldsConsumer(SegmentWriteState state) throws IOException {
+ PostingsWriterBase postingsWriter = new SepPostingsWriterImpl(state, new PForDeltaFixedIntBlockWithIntBufferFactory(blockSize));
+
+ boolean success = false;
+ TermsIndexWriterBase indexWriter;
+ try {
+ indexWriter = new VariableGapTermsIndexWriter(state, new VariableGapTermsIndexWriter.EveryNTermSelector(state.termIndexInterval));
+ success = true;
+ } finally {
+ if (!success) {
+ postingsWriter.close();
+ }
+ }
+
+ success = false;
+ try {
+ FieldsConsumer ret = new BlockTermsWriter(indexWriter, state, postingsWriter, BytesRef.getUTF8SortedAsUnicodeComparator());
+ success = true;
+ return ret;
+ } finally {
+ if (!success) {
+ try {
+ postingsWriter.close();
+ } finally {
+ indexWriter.close();
+ }
+ }
+ }
+ }
+
+ @Override
+ public FieldsProducer fieldsProducer(SegmentReadState state) throws IOException {
+ PostingsReaderBase postingsReader = new SepPostingsReaderImpl(state.dir,
+ state.segmentInfo,
+ state.readBufferSize,
+ new PForDeltaFixedIntBlockWithIntBufferFactory(blockSize), state.codecId);
+
+ TermsIndexReaderBase indexReader;
+ boolean success = false;
+ try {
+ indexReader = new VariableGapTermsIndexReader(state.dir,
+ state.fieldInfos,
+ state.segmentInfo.name,
+ state.termsIndexDivisor,
+ state.codecId);
+ success = true;
+ } finally {
+ if (!success) {
+ postingsReader.close();
+ }
+ }
+
+ success = false;
+ try {
+ FieldsProducer ret = new BlockTermsReader(indexReader,
+ state.dir,
+ state.fieldInfos,
+ state.segmentInfo.name,
+ postingsReader,
+ state.readBufferSize,
+ BytesRef.getUTF8SortedAsUnicodeComparator(),
+ StandardCodec.TERMS_CACHE_SIZE,
+ state.codecId);
+ success = true;
+ return ret;
+ } finally {
+ if (!success) {
+ try {
+ postingsReader.close();
+ } finally {
+ indexReader.close();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void files(Directory dir, SegmentInfo segmentInfo, String codecId, Set<String> files) {
+ SepPostingsReaderImpl.files(segmentInfo, codecId, files);
+ BlockTermsReader.files(dir, segmentInfo, codecId, files);
+ VariableGapTermsIndexReader.files(dir, segmentInfo, codecId, files);
+ }
+
+ @Override
+ public void getExtensions(Set<String> extensions) {
+ SepPostingsWriterImpl.getExtensions(extensions);
+ BlockTermsReader.getExtensions(extensions);
+ VariableGapTermsIndexReader.getIndexExtensions(extensions);
+ }
+}
+
Property changes on: lucene/src/java/org/apache/lucene/index/codecs/pfordelta2/PForDeltaFixedIntBlockWithIntBufferCodec.java
___________________________________________________________________
Added: svn:eol-style
+ native
Index: lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java
===================================================================
--- lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java (revision 1071187)
+++ lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java (working copy)
@@ -42,7 +42,7 @@
private final Set<String> knownExtensions = new HashSet<String>();
- public final static String[] CORE_CODECS = new String[] {"Standard", "Pulsing", "PreFlex", "SimpleText", "PatchedFrameOfRef", "FrameOfRef", "PatchedFrameOfRef2", "BulkVInt", "Simple64" };
+ public final static String[] CORE_CODECS = new String[] {"Standard", "Pulsing", "PreFlex", "SimpleText", "PatchedFrameOfRef", "FrameOfRef", "PatchedFrameOfRef2","PatchedFrameOfRef4","BulkVInt", "Simple64" };
public synchronized void register(Codec codec) {
if (codec.name == null) {
Index: lucene/src/java/org/apache/lucene/util/pfor2/LCPForDelta.java
===================================================================
--- lucene/src/java/org/apache/lucene/util/pfor2/LCPForDelta.java (revision 0)
+++ lucene/src/java/org/apache/lucene/util/pfor2/LCPForDelta.java (revision 0)
@@ -0,0 +1,548 @@
+package org.apache.lucene.util.pfor2;
+
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.Arrays;
+import java.nio.IntBuffer;
+
+/**
+ * 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.
+ *
+ * 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.
+ *
+ * @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<<POSSIBLE_B_BITS)
+ private static final int POSSIBLE_B_BITS = 5;
+ // 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 = 1;
+ // 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};
+
+ private int[] compBuffer; // buffer to hold the compressed data
+
+ public int[] getCompBuffer()
+ {
+ return compBuffer;
+ }
+
+ public void setCompBuffer(int[] buffer)
+ {
+ compBuffer = buffer;
+ }
+
+
+ /**
+ * 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;
+ }
+ }
+ }
+
+ // compress the block using the above best b
+ int compressedSizeInInts = compressOneBlockCore(inBlock, blockSize, currentB);
+
+ return compressedSizeInInts;
+ }
+
+ /**
+ * 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]);
+
+ // 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;
+ }
+
+ // 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;
+ }
+
+ 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;
+ }
+
+ /**
+ * 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 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 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);
+ }
+ }
+ }
+
+ public 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
+ {
+ Unpack128WithBuffer.unpack(decompBlock, inBlock, bits);
+ }
+
+ if(expNum>0)
+ {
+ // decompress expPos
+ int num, outOffset=0, numLeft;
+ for(numLeft=expNum; numLeft>0; numLeft -= num)
+ {
+ num = Simple16.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 = Simple16.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 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;
+ }
+
+ /**
+ * 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 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 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;
+ }
+
+
+ public int decompressBBitSlotsWithHardCodes(final int[] outDecompSlots, final int[] inCompBlock, final int blockSize, final int bits)
+ {
+ int compressedBitSize = 0;
+ Unpack128.unpack(outDecompSlots, inCompBlock, bits);
+ compressedBitSize = bits * blockSize;
+ return compressedBitSize;
+ }
+
+ public int decompressBBitSlotsWithHardCodesWithIntBuffer(final int[] outDecompSlots, final IntBuffer inCompBlock, final int blockSize, final int bits)
+ {
+ Unpack128WithBuffer.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 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 = Simple16.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 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 void decompressBlockByS16WithIntBuffer(final int[] outDecompBlock, final IntBuffer inCompBlock, final int blockSize)
+ {
+ int num, outOffset=0, numLeft;
+ for(numLeft=blockSize; numLeft>0; numLeft -= num)
+ {
+ num = Simple16.s16DecompressWithIntBuffer(outDecompBlock, outOffset, inCompBlock.get(), numLeft);
+ outOffset += num;
+ }
+ }
+
+ public 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 = Simple16.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));
+ }
+ }
+
+ /**
+ * 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));
+ }
+
+ 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));
+ }
+
+ }
+
+
Property changes on: lucene/src/java/org/apache/lucene/util/pfor2/LCPForDelta.java
___________________________________________________________________
Added: svn:eol-style
+ native
Index: lucene/src/java/org/apache/lucene/util/pfor2/Simple16.java
===================================================================
--- lucene/src/java/org/apache/lucene/util/pfor2/Simple16.java (revision 1071187)
+++ lucene/src/java/org/apache/lucene/util/pfor2/Simple16.java (working copy)
@@ -17,6 +17,9 @@
* limitations under the License.
*/
+import java.nio.IntBuffer;
+
+
/**
* Implementation of the Simple16 algorithm for sorted integer arrays. The basic ideas are based on papers from
*
@@ -24,15 +27,22 @@
*
* 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).
+ *
+ * Author: Hao Yan, hyan2008@gmail.com
*/
-public class Simple16 {
+public class Simple16{
private static final int S16_NUMSIZE = 16;
private static final int S16_BITSSIZE = 28;
- // the possible number of bits used to represent one integer
+
+ //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 corresponding number of elements for each value of the number of bits
+
+ //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},
@@ -50,6 +60,14 @@
{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} };
+ 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 an integer array using Simple16
*
@@ -66,6 +84,33 @@
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;
+ }
+ }
+
+ 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]); )
@@ -107,8 +152,549 @@
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;
+ }
+ 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;
+ }
+ 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;
+ }
+ 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;
+ }
+ 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 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
@@ -120,4 +706,12 @@
final int val = (in[inIntOffset] >>> inWithIntOffset);
return val & (0xffffffff >>> (32 - bits));
}
+
+ static private int readBitsForS16WithValue(final int value, final int inWithIntOffset, final int bits) {
+ final int val = (value >>> inWithIntOffset);
+ return val & (0xffffffff >>> (32 - bits));
+ }
+
}
+
+
Index: lucene/src/java/org/apache/lucene/util/pfor2/PForDelta.java
===================================================================
--- lucene/src/java/org/apache/lucene/util/pfor2/PForDelta.java (revision 1071187)
+++ lucene/src/java/org/apache/lucene/util/pfor2/PForDelta.java (working copy)
@@ -1,350 +0,0 @@
-package org.apache.lucene.util.pfor2;
-
-
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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
- *
- * 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.
- * @author hao yan, hyan2008@gmail.com
- */
-// nocommit -- must merge our 2 pfor impls before landing on trunk
-// nocommit -- need serious random unit test for these int encoders
-public class PForDelta{
-
- //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 = 1;
- // 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[] compressOneBlock(final 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;
- 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
- int[] outBlock = compressOneBlockCore(inBlock, currentB, blockSize);
-
- return outBlock;
- }
-
- /**
- * Decompress one block using PForDelta
- * @param inBlock the block to be decompressed
- * @param blockSize the number of elements in the decompressed block
- * @return the decompressed block
- */
- public static int[] decompressOneBlock(int[] inBlock, int blockSize)
- {
- int[] expPos = new int[blockSize];
- int[] expHighBits = new int[blockSize];
- int[] outBlock = new int[blockSize];
- assert inBlock != null;
- /*
- if(inBlock == null)
- {
- System.out.println("error: compBlock is null");
- return null;
- }
- */
-
- 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);
- }
- offset += compressedBits;
-
- // decompress exceptions
- if(expNum>0)
- {
- compressedBits = decompressBlockByS16(expPos, inBlock, offset, expNum);
- offset += compressedBits;
- compressedBits = decompressBlockByS16(expHighBits, inBlock, offset, expNum);
- offset += compressedBits;
-
- for (int i = 0; i < expNum; i++)
- {
- int curExpPos = expPos[i] ;
- int curHighBits = expHighBits[i];
- outBlock[curExpPos] = (outBlock[curExpPos] & MASK[bits]) | ((curHighBits & MASK[32-bits] ) << bits);
- }
- }
- return outBlock;
- }
-
- /**
- * 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
- */
- private 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;
- }
-
- /**
- * 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
- */
- private static int[] compressOneBlockCore(int[] inputBlock, int bits, int blockSize) throws IllegalArgumentException {
- int[] expPos = new int[blockSize];
- int[] expHighBits = new int[blockSize];
-
- 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;
-
- // compress the b-bit slots
- for (int i = 0; i<blockSize; ++i)
- {
- assert inputBlock[i] >= 0: "input value is " + inputBlock[i];
- /*
- if(inputBlock[i] < 0)
- {
- System.out.println("haha<0: [" + i +"]" + inputBlock[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
- expPos[expNum] = i;
- // write the higher 32-bits bits of the exception
- expHighBits[expNum] = (inputBlock[i] >>> bits) & MASK[32-bits];
- expNum++;
- }
- outputOffset += bits;
- }
-
- // the first int in the compressed block stores the value of b and the number of exceptions
- tmpCompressedBlock[0] = ((bits & MASK[10]) << 10) | (expNum & 0x3ff);
-
- // compress exceptions
- if(expNum>0)
- {
- int compressedBitSize = compressBlockByS16(tmpCompressedBlock, outputOffset, expPos, expNum, blockSize, inputBlock);
- outputOffset += compressedBitSize;
- compressedBitSize = compressBlockByS16(tmpCompressedBlock, outputOffset, expHighBits, expNum, blockSize, inputBlock);
- 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;
- }
-
- /**
- * 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
- */
- private 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;
- }
-
- /**
- * 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 = Simple16.s16Compress(outCompBlock, outOffset, inBlock, inOffset, numLeft, blockSize, oriBlockSize, oriInputBlock);
- assert num >= 0;
- /*
- if(num<0)
- {
- System.out.println("oops: s16 get -1 ");
- }
- */
- 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
- */
- private 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;
- }
-
-
- /**
- * 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)
- */
- private 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 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
- */
- private 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));
- }
-
-}
-
-
Index: lucene/src/java/org/apache/lucene/util/pfor2/Unpack128WithBuffer.java
===================================================================
--- lucene/src/java/org/apache/lucene/util/pfor2/Unpack128WithBuffer.java (revision 0)
+++ lucene/src/java/org/apache/lucene/util/pfor2/Unpack128WithBuffer.java (revision 0)
@@ -0,0 +1,862 @@
+package org.apache.lucene.util.pfor2;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.nio.IntBuffer;
+
+
+public class Unpack128WithBuffer{
+
+ 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;
+ }
+ }
+}
Property changes on: lucene/src/java/org/apache/lucene/util/pfor2/Unpack128WithBuffer.java
___________________________________________________________________
Added: svn:eol-style
+ native
Index: lucene/src/java/org/apache/lucene/util/pfor2/Unpack128.java
===================================================================
--- lucene/src/java/org/apache/lucene/util/pfor2/Unpack128.java (revision 0)
+++ lucene/src/java/org/apache/lucene/util/pfor2/Unpack128.java (revision 0)
@@ -0,0 +1,876 @@
+package org.apache.lucene.util.pfor2;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+public class Unpack128{
+
+ 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;
+ }
+ }
+}
Property changes on: lucene/src/java/org/apache/lucene/util/pfor2/Unpack128.java
___________________________________________________________________
Added: svn:eol-style
+ native