/** Generate the codewords corresponding to this tree decoder. * * @return a vector of codewords for this decoder. */ public BitVector[] buildCodes() { final BitVector[] codeWord = new BitVector[n]; buildCodes(codeWord, root, LongArrayBitVector.getInstance()); return codeWord; }
/** Generate the codewords corresponding to this tree decoder. * * @return a vector of codewords for this decoder. */ public BitVector[] buildCodes() { final BitVector[] codeWord = new BitVector[ n ]; buildCodes( codeWord, root, LongArrayBitVector.getInstance() ); return codeWord; } }
/** Generate the codewords corresponding to this tree decoder. * * @return a vector of codewords for this decoder. */ public BitVector[] buildCodes() { final BitVector[] codeWord = new BitVector[ n ]; buildCodes( codeWord, root, LongArrayBitVector.getInstance() ); return codeWord; } }
@Override public BitVector toBitVector(final CharSequence cs) { final String s = cs.toString(); final int length = s.length(); final LongArrayBitVector bitVector = LongArrayBitVector.getInstance(length(s)); for (int i = 0, cp; i < length; i += Character.charCount(cp)) bitVector.append(cp = s.codePointAt(i), Integer.SIZE); return bitVector; }
@Override public BitVector toBitVector(final CharSequence cs) { final String s = cs.toString(); final int length = s.length(); final LongArrayBitVector bitVector = LongArrayBitVector.getInstance(length(s)); for (int i = 0, cp; i < length; i += Character.charCount(cp)) bitVector.append(Integer.reverse(cp = s.codePointAt(i)) & -1L >>> 32, Integer.SIZE); if (prefixFree) bitVector.append(0, Integer.SIZE); return bitVector; }
@Override public LongArrayBitVector toBitVector(final CharSequence s) { final BitVector[] codeWord = this.codeWord; final Char2IntMap char2symbol = this.char2symbol; final int length = s.length(); int numBits = (int) (prefixFree ? codeWord[0].length() : 0); for(int i = length; i-- != 0;) numBits += codeWord[char2symbol.get(s.charAt(i))].length(); final LongArrayBitVector result = LongArrayBitVector.getInstance(numBits); for(int i = 0; i < s.length(); i++) result.append(codeWord[char2symbol.get(s.charAt(i))]); if (prefixFree) result.append(codeWord[0]); return result; }
public LongArrayBitVector toBitVector( final CharSequence s ) { final BitVector[] codeWord = this.codeWord; final Char2IntMap char2symbol = this.char2symbol; final int length = s.length(); int numBits = prefixFree ? codeWord[ 0 ].size() : 0; for( int i = length; i-- != 0; ) numBits += codeWord[ char2symbol.get( s.charAt( i ) ) ].size(); final LongArrayBitVector result = LongArrayBitVector.getInstance( numBits ); for( int i = 0; i < s.length(); i++ ) result.append( codeWord[ char2symbol.get( s.charAt( i ) ) ] ); if ( prefixFree ) result.append( codeWord[ 0 ] ); return result; }
public LongArrayBitVector toBitVector( final CharSequence s ) { final BitVector[] codeWord = this.codeWord; final Char2IntMap char2symbol = this.char2symbol; final int length = s.length(); int numBits = prefixFree ? codeWord[ 0 ].size() : 0; for( int i = length; i-- != 0; ) numBits += codeWord[ char2symbol.get( s.charAt( i ) ) ].size(); final LongArrayBitVector result = LongArrayBitVector.getInstance( numBits ); for( int i = 0; i < s.length(); i++ ) result.append( codeWord[ char2symbol.get( s.charAt( i ) ) ] ); if ( prefixFree ) result.append( codeWord[ 0 ] ); return result; }
/** Creates a new Bloom filter with given number of hash functions and expected number of elements. * * @param n the expected number of elements. * @param d the number of hash functions; if the filter add not more than <code>n</code> elements, * false positives will happen with probability 2<sup>-<var>d</var></sup>. */ public IntBloomFilter( final int n, final int d ) { this.d = d; bits = LongArrayBitVector.getInstance().length( (long)Math.ceil( ( n * d / NATURAL_LOG_OF_2 ) ) ); m = bits.length() * Long.SIZE; if ( DEBUG ) System.err.println( "Number of bits: " + m ); // The purpose of Random().nextInt() is to generate a different seed at each invocation. final MersenneTwister mersenneTwister = new MersenneTwister( new Random().nextInt() ); a = new int[ d ]; b = new int[ d ]; for( int i = 0; i < d; i++ ) { a[ i ] = mersenneTwister.nextInt(); b[ i ] = mersenneTwister.nextInt(); } }
/** Creates a new Bloom filter with given number of hash functions and expected number of elements. * * @param n the expected number of elements. * @param d the number of hash functions; if the filter add not more than <code>n</code> elements, * false positives will happen with probability 2<sup>-<var>d</var></sup>. */ public IntBloomFilter( final int n, final int d ) { this.d = d; bits = LongArrayBitVector.getInstance().length( (long)Math.ceil( ( n * d / NATURAL_LOG_OF_2 ) ) ); m = bits.length() * Long.SIZE; if ( DEBUG ) System.err.println( "Number of bits: " + m ); // The purpose of Random().nextInt() is to generate a different seed at each invocation. final MersenneTwister mersenneTwister = new MersenneTwister( new Random().nextInt() ); a = new int[ d ]; b = new int[ d ]; for( int i = 0; i < d; i++ ) { a[ i ] = mersenneTwister.nextInt(); b[ i ] = mersenneTwister.nextInt(); } }
public LongArrayBitVector succinctRepresentation() { final LongArrayBitVector bitVector = LongArrayBitVector.getInstance(); bitVector.add(true); // Fake open parenthesis if (root != null) visit(root, bitVector); bitVector.add(false); // Fake closed parenthesis bitVector.trim(); return bitVector; } }
/** Returns the bit vector indexed; since the bits are not stored in this data structure, * a copy is built on purpose and returned. * * <p><strong>Warning</strong>: this method is very slow, as the only way to recover the original bit * array is to rank each position in the bit vector. * * @return a copy of the underlying bit vector. */ @Override public BitVector bitVector() { final LongArrayBitVector result = LongArrayBitVector.getInstance().length(n); long prev = 0, rank; for(long i = 1; i <= n; i++) { if ((rank = rank(i)) != prev) result.set(i - 1); prev = rank; } return result; } }
/** Creates a new shift-add-xor signed string map using a given hash map. * * @param iterator an iterator enumerating a set of strings. * @param map a minimal perfect hash for the strings enumerated by <code>iterator</code>; it must support {@link Function#size() size()} * and have default return value -1. * @param signatureWidth the width, in bits, of the signature of each string. */ public ShiftAddXorSignedStringMap( final Iterator<? extends CharSequence> iterator, final Object2LongFunction<? extends CharSequence> map, final int signatureWidth ) { CharSequence s; this.function = map; this.width = signatureWidth; this.defRetValue = -1; shift = Long.SIZE - width; mask = width == Long.SIZE ? 0 : ( 1L << width ) - 1; final int n = map.size(); signatures = LongArrayBitVector.getInstance().asLongBigList( signatureWidth ).length( n ); for( int i = 0; i < n; i++ ) { s = iterator.next(); signatures.set( map.getLong( s ), signature( s ) ); } if ( iterator.hasNext() ) throw new IllegalStateException( "Iterator provides more than " + n + " elements" ); }
/** Creates a new shift-add-xor signed string map using a given hash map. * * @param iterator an iterator enumerating a set of strings. * @param map a minimal perfect hash for the strings enumerated by <code>iterator</code>; it must support {@link Function#size() size()} * and have default return value -1. * @param signatureWidth the width, in bits, of the signature of each string. */ public ShiftAddXorSignedStringMap( final Iterator<? extends CharSequence> iterator, final Object2LongFunction<? extends CharSequence> map, final int signatureWidth ) { CharSequence s; this.function = map; this.width = signatureWidth; this.defRetValue = -1; shift = Long.SIZE - width; mask = width == Long.SIZE ? 0 : ( 1L << width ) - 1; final int n = map.size(); signatures = LongArrayBitVector.getInstance().asLongBigList( signatureWidth ).length( n ); for( int i = 0; i < n; i++ ) { s = iterator.next(); signatures.set( map.getLong( s ), signature( s ) ); } if ( iterator.hasNext() ) throw new IllegalStateException( "Iterator provides more than " + n + " elements" ); }
/** Creates a new shift-add-xor signed string map using a given hash map. * * @param iterator an iterator enumerating a set of strings. * @param map a minimal perfect hash for the strings enumerated by <code>iterator</code>; it must support {@link Function#size() size()} * and have default return value -1. * @param signatureWidth the width, in bits, of the signature of each string. */ public ShiftAddXorSignedStringMap(final Iterator<? extends CharSequence> iterator, final Object2LongFunction<? extends CharSequence> map, final int signatureWidth) { CharSequence s; this.function = map; this.width = signatureWidth; this.defRetValue = -1; shift = Long.SIZE - width; mask = width == Long.SIZE ? 0 : (1L << width) - 1; final int n = map.size(); signatures = LongArrayBitVector.getInstance().asLongBigList(signatureWidth); signatures.size(n); for(int i = 0; i < n; i++) { s = iterator.next(); signatures.set(map.getLong(s), signature(s)); } if (iterator.hasNext()) throw new IllegalStateException("Iterator provides more than " + n + " elements"); }
/** Creates a new shift-add-xor signed string map using a given hash map. * * @param iterator an iterator enumerating a set of strings. * @param map a minimal perfect hash for the strings enumerated by <code>iterator</code>; it must support {@link Function#size() size()} * and have default return value -1. * @param signatureWidth the width, in bits, of the signature of each string. */ public ShiftAddXorSignedStringMap(final Iterator<? extends CharSequence> iterator, final Object2LongFunction<? extends CharSequence> map, final int signatureWidth) { CharSequence s; this.function = map; this.width = signatureWidth; this.defRetValue = -1; shift = Long.SIZE - width; mask = width == Long.SIZE ? 0 : (1L << width) - 1; final long n = map instanceof Size64 ? ((Size64)map).size64() : map.size(); (signatures = LongArrayBitVector.getInstance().asLongBigList(signatureWidth)).size(n); for(long i = 0; i < n; i++) { s = iterator.next(); signatures.set(map.getLong(s), signature(s)); } if (iterator.hasNext()) throw new IllegalStateException("Iterator provides more than " + n + " elements"); }
l = length == 0 ? 0 : Math.max(0, Fast.mostSignificantBit(upperBound / length)); final long lowerBitsMask = (1L << l) - 1; final LongBigList lowerBitsList = LongArrayBitVector.getInstance().asLongBigList(l); lowerBitsList.size(length); final BitVector upperBitsVector = LongArrayBitVector.getInstance().length(length + (upperBound >>> l) + 1); long v = 0; for(int i = 0; i < length; i++) {
/** Generate a list of signatures using the lowest bits of the first hash in this store. * * <p>For this method to work, this store must contain ranks. * * @param signatureWidth the width in bits of the signatures. * @param pl a progress logger. */ public LongBigList signatures(final int signatureWidth, final ProgressLogger pl) throws IOException { final LongBigList signatures = LongArrayBitVector.getInstance().asLongBigList(signatureWidth); final long signatureMask = -1L >>> Long.SIZE - signatureWidth; signatures.size(size()); pl.expectedUpdates = size(); pl.itemsName = "signatures"; pl.start("Signing..."); for (final ChunkedHashStore.Chunk chunk : this) { final Iterator<long[]> chunkIterator = chunk.iterator(); for(int i = chunk.size(); i-- != 0;) { final long[] quadruple = chunkIterator.next(); signatures.set(quadruple[3], signatureMask & quadruple[0]); pl.lightUpdate(); } } pl.done(); return signatures; }
private void recToString(final InputBitStream trie, final MutableString printPrefix, final MutableString result, final MutableString path, final int level) throws IOException { final long skip = trie.readLongDelta(); //System.err.println("Called with prefix " + printPrefix); result.append(printPrefix).append('(').append(level).append(')'); final int pathLength = trie.readDelta(); final LongArrayBitVector p = LongArrayBitVector.getInstance(pathLength); for(int i = 0; i < (pathLength + Long.SIZE - 1) / Long.SIZE; i++) { final int size = Math.min(Long.SIZE, pathLength - i * Long.SIZE); p.append(trie.readLong(size), size); } if (skip == 0) return; // Leaf int missing = trie.readDelta(); path.append(p); result.append(" path:").append(p); while(missing-- != 0) result.append('*'); result.append('\n'); trie.readDelta(); // Skip number of leaves in the left subtree path.append('0'); recToString(trie, printPrefix.append('\t').append("0 => "), result, path, level + 1); path.charAt(path.length() - 1, '1'); recToString(trie, printPrefix.replace(printPrefix.length() - 5, printPrefix.length(), "1 => "), result, path, level + 1); path.delete(path.length() - 1, path.length()); printPrefix.delete(printPrefix.length() - 6, printPrefix.length()); //System.err.println("Path now: " + path + " Going to delete from " + (path.length() - n.pathLength)); path.delete(path.length() - pathLength, path.length()); }
private void recToString(final InputBitStream trie, final MutableString printPrefix, final MutableString result, final MutableString path, final int level) throws IOException { final long skip = trie.readLongDelta(); //System.err.println("Called with prefix " + printPrefix); result.append(printPrefix).append('(').append(level).append(')'); final int pathLength = trie.readDelta(); final LongArrayBitVector p = LongArrayBitVector.getInstance(pathLength); for(int i = 0; i < (pathLength + Long.SIZE - 1) / Long.SIZE; i++) { final int size = Math.min(Long.SIZE, pathLength - i * Long.SIZE); p.append(trie.readLong(size), size); } if (skip == 0) return; // Leaf int missing = trie.readDelta(); path.append(p); result.append(" path:").append(p); while(missing-- != 0) result.append('*'); result.append('\n'); trie.readDelta(); // Skip number of leaves in the left subtree path.append('0'); recToString(trie, printPrefix.append('\t').append("0 => "), result, path, level + 1); path.charAt(path.length() - 1, '1'); recToString(trie, printPrefix.replace(printPrefix.length() - 5, printPrefix.length(), "1 => "), result, path, level + 1); path.delete(path.length() - 1, path.length()); printPrefix.delete(printPrefix.length() - 6, printPrefix.length()); //System.err.println("Path now: " + path + " Going to delete from " + (path.length() - n.pathLength)); path.delete(path.length() - pathLength, path.length()); }