protected Modulo2Equation(final Modulo2Equation equation){ this.c = equation.c; this.bitVector = equation.bitVector.copy(); this.bits = this.bitVector.bits(); this.firstVar = equation.firstVar; this.isEmpty = equation.isEmpty; }
protected Modulo3Equation(final Modulo3Equation equation){ this.c = equation.c; this.bitVector = equation.bitVector.copy(); this.bits = this.bitVector.bits(); this.list = this.bitVector.asLongBigList(2); this.firstVar = equation.firstVar; this.firstCoeff = equation.firstCoeff; this.isEmpty = equation.isEmpty; }
/** Creates a trie from a set of elements. * * @param elements a set of elements * @param transformationStrategy a transformation strategy that must turn <code>elements</code> into a list of * distinct, lexicographically increasing (in iteration order) binary words. */ public ImmutableBinaryTrie(final Iterable<? extends T> elements, final TransformationStrategy<? super T> transformationStrategy) { this.transformationStrategy = transformationStrategy; defRetValue = -1; // Check order final Iterator<? extends T> iterator = elements.iterator(); final ObjectList<LongArrayBitVector> words = new ObjectArrayList<>(); int cmp; if (iterator.hasNext()) { final LongArrayBitVector prev = LongArrayBitVector.copy(transformationStrategy.toBitVector(iterator.next())); words.add(prev.copy()); BitVector curr; while(iterator.hasNext()) { curr = transformationStrategy.toBitVector(iterator.next()); cmp = prev.compareTo(curr); if (cmp == 0) throw new IllegalArgumentException("The trie elements are not unique"); if (cmp > 0) throw new IllegalArgumentException("The trie elements are not sorted"); prev.replace(curr); words.add(prev.copy()); } } root = buildTrie(words, 0); }
/** Creates a trie from a set of elements. * * @param elements a set of elements * @param transformationStrategy a transformation strategy that must turn <code>elements</code> into a list of * distinct, lexicographically increasing (in iteration order) binary words. */ public ImmutableBinaryTrie( final Iterable<? extends T> elements, final TransformationStrategy<? super T> transformationStrategy ) { this.transformationStrategy = transformationStrategy; defRetValue = -1; // Check order final Iterator<? extends T> iterator = elements.iterator(); final ObjectList<LongArrayBitVector> words = new ObjectArrayList<LongArrayBitVector>(); int cmp; if ( iterator.hasNext() ) { final LongArrayBitVector prev = LongArrayBitVector.copy( transformationStrategy.toBitVector( iterator.next() ) ); words.add( prev.copy() ); BitVector curr; while( iterator.hasNext() ) { curr = transformationStrategy.toBitVector( iterator.next() ); cmp = prev.compareTo( curr ); if ( cmp == 0 ) throw new IllegalArgumentException( "The trie elements are not unique" ); if ( cmp > 0 ) throw new IllegalArgumentException( "The trie elements are not sorted" ); prev.replace( curr ); words.add( prev.copy() ); } } root = buildTrie( words, 0 ); }
/** Creates a trie from a set of elements. * * @param elements a set of elements * @param transformationStrategy a transformation strategy that must turn <code>elements</code> into a list of * distinct, lexicographically increasing (in iteration order) binary words. */ public ImmutableBinaryTrie( final Iterable<? extends T> elements, final TransformationStrategy<? super T> transformationStrategy ) { this.transformationStrategy = transformationStrategy; defRetValue = -1; // Check order final Iterator<? extends T> iterator = elements.iterator(); final ObjectList<LongArrayBitVector> words = new ObjectArrayList<LongArrayBitVector>(); int cmp; if ( iterator.hasNext() ) { final LongArrayBitVector prev = LongArrayBitVector.copy( transformationStrategy.toBitVector( iterator.next() ) ); words.add( prev.copy() ); BitVector curr; while( iterator.hasNext() ) { curr = transformationStrategy.toBitVector( iterator.next() ); cmp = prev.compareTo( curr ); if ( cmp == 0 ) throw new IllegalArgumentException( "The trie elements are not unique" ); if ( cmp > 0 ) throw new IllegalArgumentException( "The trie elements are not sorted" ); prev.replace( curr ); words.add( prev.copy() ); } } root = buildTrie( words, 0 ); }
/** Creates a trie from a set of elements. * * @param elements a set of elements * @param transformationStrategy a transformation strategy that must turn <code>elements</code> into a list of * distinct, lexicographically increasing (in iteration order) binary words. */ public ImmutableBinaryTrie(final Iterable<? extends T> elements, final TransformationStrategy<? super T> transformationStrategy) { this.transformationStrategy = transformationStrategy; defRetValue = -1; // Check order final Iterator<? extends T> iterator = elements.iterator(); final ObjectList<LongArrayBitVector> words = new ObjectArrayList<>(); int cmp; if (iterator.hasNext()) { final LongArrayBitVector prev = LongArrayBitVector.copy(transformationStrategy.toBitVector(iterator.next())); words.add(prev.copy()); BitVector curr; while(iterator.hasNext()) { curr = transformationStrategy.toBitVector(iterator.next()); cmp = prev.compareTo(curr); if (cmp == 0) throw new IllegalArgumentException("The trie elements are not unique"); if (cmp > 0) throw new IllegalArgumentException("The trie elements are not sorted"); prev.replace(curr); words.add(prev.copy()); } } root = buildTrie(words, 0); }
@Override @SuppressWarnings("unchecked") public boolean contains(final Object o) { if (DEBUG) System.err.println("contains(" + o + ")"); if (DDEBUG) System.err.println("Map: " + handle2Node + " root: " + root); if (size == 0) return false; final LongArrayBitVector v = LongArrayBitVector.copy(transform.toBitVector((T)o)); final long[] state = Hashes.preprocessMurmur(v, 42); final ExitData<T> exitData = getExitNode(v, state); return exitData.exitNode.isLeaf() && exitData.lcp == transform.length(((Leaf<T>)exitData.exitNode).key); }
private Leaf<T> succNode(final T k) { final LongArrayBitVector v = LongArrayBitVector.copy(transform.toBitVector(k)); final long[] state = Hashes.preprocessMurmur(v, 42); final Node<T> exitNode = getExitNode(v, state).exitNode; if (v.compareTo(exitNode.extent(transform)) <= 0) return exitNode.leftLeaf(); else return exitNode.rightLeaf().next; }
private Leaf<T> predNode(final T k) { final LongArrayBitVector v = LongArrayBitVector.copy(transform.toBitVector(k)); final long[] state = Hashes.preprocessMurmur(v, 42); final Node<T> exitNode = getExitNode(v, state).exitNode; if (v.compareTo(exitNode.extent(transform)) <= 0) return exitNode.rightLeaf(); else return exitNode.leftLeaf().prev; }
if ( elements.size() == 1 ) return new Node( pos < prefix ? LongArrayBitVector.copy( first.subVector( pos, prefix ) ) : null, size++ ); n = new Node( prefix > pos ? LongArrayBitVector.copy( first.subVector( pos, prefix ) ) : null, size++ ); n.left = buildTrie( elements.subList( 1, change ), prefix + 1 ); n.right = buildTrie( elements.subList( change, elements.size() ), prefix + 1 ); n = new Node( prefix > pos ? LongArrayBitVector.copy( first.subVector( pos, prefix ) ) : null ); // There's some common prefix n.left = buildTrie( elements.subList( 0, change ), prefix + 1 ); n.right = buildTrie( elements.subList( change, elements.size() ), prefix + 1 );
if (elements.size() == 1) return new Node(pos < prefix ? LongArrayBitVector.copy(first.subVector(pos, prefix)) : null, size++); n = new Node(prefix > pos ? LongArrayBitVector.copy(first.subVector(pos, prefix)) : null, size++); n.left = buildTrie(elements.subList(1, change), prefix + 1); n.right = buildTrie(elements.subList(change, elements.size()), prefix + 1); n = new Node(prefix > pos ? LongArrayBitVector.copy(first.subVector(pos, prefix)) : null); // There's some common prefix n.left = buildTrie(elements.subList(0, change), prefix + 1); n.right = buildTrie(elements.subList(change, elements.size()), prefix + 1);
if (elements.size() == 1) return new Node(pos < prefix ? LongArrayBitVector.copy(first.subVector(pos, prefix)) : null, size++); n = new Node(prefix > pos ? LongArrayBitVector.copy(first.subVector(pos, prefix)) : null, size++); n.left = buildTrie(elements.subList(1, change), prefix + 1); n.right = buildTrie(elements.subList(change, elements.size()), prefix + 1); n = new Node(prefix > pos ? LongArrayBitVector.copy(first.subVector(pos, prefix)) : null); // There's some common prefix n.left = buildTrie(elements.subList(0, change), prefix + 1); n.right = buildTrie(elements.subList(change, elements.size()), prefix + 1);
if ( elements.size() == 1 ) return new Node( pos < prefix ? LongArrayBitVector.copy( first.subVector( pos, prefix ) ) : null, size++ ); n = new Node( prefix > pos ? LongArrayBitVector.copy( first.subVector( pos, prefix ) ) : null, size++ ); n.left = buildTrie( elements.subList( 1, change ), prefix + 1 ); n.right = buildTrie( elements.subList( change, elements.size() ), prefix + 1 ); n = new Node( prefix > pos ? LongArrayBitVector.copy( first.subVector( pos, prefix ) ) : null ); // There's some common prefix n.left = buildTrie( elements.subList( 0, change ), prefix + 1 ); n.right = buildTrie( elements.subList( change, elements.size() ), prefix + 1 );
final LongArrayBitVector prev = LongArrayBitVector.copy(transformationStrategy.toBitVector(iterator.next())); pl.lightUpdate(); final LongArrayBitVector shortest = prev.copy(); long shortestIndex = 0; root = new Node(null, null, shortest.copy()); prevDelimiter.replace(shortest); final long pathLength = node.path.length(); if (prefix < pathLength) { n = new Node(node.left, node.right, node.path.copy(prefix + 1, pathLength)); node.path.length(prefix); node.path.trim(); node.left = n; node.right = new Node(null, null, shortest.copy(pos + prefix + 1, shortest.length())); break;
void labelIntermediateTrie(final Node node, final LongArrayBitVector path, final OfflineIterable<BitVector, LongArrayBitVector> delimiters, final OfflineIterable<BitVector, LongArrayBitVector> representations, final OfflineIterable<BitVector, LongArrayBitVector> keys, final LongBigList internalNodeSignatures, final long seed, final boolean left) throws IOException { assert (node.left != null) == (node.right != null); final long parentPathLength = Math.max(0, path.length() - 1); if (node.left != null) { path.append(node.path); labelIntermediateTrie(node.left, path.append(0, 1), delimiters, representations, keys, internalNodeSignatures, seed, true); path.removeBoolean((int)(path.length() - 1)); final long h = Hashes.spooky4(path, seed); final long p = (-1L << Fast.mostSignificantBit(parentPathLength ^ path.length()) & path.length()); assert p <= path.length() : p + " > " + path.length(); assert path.length() == 0 || p > parentPathLength : p + " <= " + parentPathLength; keys.add(LongArrayBitVector.copy(path.subVector(0, p))); representations.add(path.copy()); assert Fast.length(path.length()) <= logW; if (DDDEBUG) System.err.println("Entering " + path + " with key (" + p + "," + path.subVector(0, p).hashCode() + ") " + path.subVector(0, p) + ", signature " + (h & signatureMask) + " and length " + (path.length() & logWMask) + "(value: " + ((h & signatureMask) << logW | (path.length() & logWMask)) + ")"); internalNodeSignatures.add((h & signatureMask) << logW | (path.length() & logWMask)); labelIntermediateTrie(node.right, path.append(1, 1), delimiters, representations, keys, internalNodeSignatures, seed, false); path.length(path.length() - node.path.length() - 1); } else { if (left) delimiters.add(LongArrayBitVector.copy(path.subVector(0, path.lastOne() + 1))); else delimiters.add(LongArrayBitVector.copy(path)); } }
final ZFastTrie<LongArrayBitVector> zFastTrie = new ZFastTrie<>(TransformationStrategies.identity()); while(lineIterator.hasNext()) { zFastTrie.add(LongArrayBitVector.copy(transformationStrategy.toBitVector(lineIterator.next().copy()))); pl.lightUpdate();
final LongArrayBitVector prev = LongArrayBitVector.copy(transformationStrategy.toBitVector(iterator.next())); pl.lightUpdate(); root = new Node(null, null, prev.copy()); prevDelimiter.replace(prev); final long pathLength = node.path.length(); if (prefix < pathLength) { n = new Node(node.left, node.right, node.path.copy(prefix + 1, pathLength)); node.path.length(prefix); node.path.trim(); node.left = n; node.right = new Node(null, null, prev.copy(pos + prefix + 1, prev.length())); break;
public boolean remove(final Object k) { if (DEBUG) System.err.println("remove(" + k + ")"); final LongArrayBitVector v = LongArrayBitVector.copy(transform.toBitVector((T)k));
@Override public boolean add(final T k) { if (DEBUG) System.err.println("add(" + k + ")"); final LongArrayBitVector v = LongArrayBitVector.copy(transform.toBitVector(k)); if (DEBUG) System.err.println("add(" + v + ")");