/** * @param values * @param newCapacities * @param ngramOrder * @return */ private ExplicitWordHashMap initMap(final long newCapacity, final int ngramOrder) { final ExplicitWordHashMap newMap = new ExplicitWordHashMap(newCapacity); explicitMaps[ngramOrder] = newMap; values.setSizeAtLeast(explicitMaps[ngramOrder].getCapacity(), ngramOrder); return newMap; }
public void rehashIfNecessary(int num) { if (explicitMaps == null) return; for (int ngramOrder = 0; ngramOrder < explicitMaps.length; ++ngramOrder) { if (explicitMaps[ngramOrder] == null) continue; if (explicitMaps[ngramOrder].getLoadFactor(num) >= maxLoadFactor) { rehash(ngramOrder, (explicitMaps[ngramOrder].getCapacity() + num) * 3 / 2, num); return; } } }
if (explicitMaps[ngramOrder] == null) break; if (ngramOrder < changedNgramOrder) { newCapacities[ngramOrder] = explicitMaps[ngramOrder].getCapacity(); } else if (ngramOrder == changedNgramOrder) { newCapacities[ngramOrder] = newCapacity; newCapacities[ngramOrder] = explicitMaps[ngramOrder].getLoadFactor(numAdding) >= maxLoadFactor / 2 ? ((explicitMaps[ngramOrder].getCapacity() + numAdding) * 3 / 2) : explicitMaps[ngramOrder].getCapacity(); final T val = values.getScratchValue(); final int[] scratchArray = new int[ngramOrder + 1]; for (long actualIndex = 0; actualIndex < currHashMap.getCapacity(); ++actualIndex) { final long key = currHashMap.getKey(actualIndex); if (currHashMap.isEmptyKey(key)) continue; getNgramFromContextEncodingHelp(contextOffsetOf(key), ngramOrder - 1, wordOf(key), scratchArray); final long newKey = newMap.getKey(scratchArray, 0, scratchArray.length); assert newKey >= 0 : "Failure for old n-gram " + Arrays.toString(scratchArray); final long index = newHashMap.put(newKey); assert index >= 0;
@Override public long put(final long key) { final long hash = hash(key); if (hash < 0) return -1L; final long rangeStart = 0; final long rangeEnd = keysSize; final long i = keys.linearSearch(key, rangeStart, rangeEnd, hash, EMPTY_KEY, true); if (keys.get(i) == EMPTY_KEY) { numFilled++; if (numFilled >= keysSize) { throw new RuntimeException("Hash map is full with " + keysSize + " keys. Should never happen."); } } setKey(i, key); return i; }
public double getLoadFactor(int numAdditional) { return (double) (numFilled + numAdditional) / getCapacity(); }
@Override public final long getOffset(final long key) { final long hash = hash(key); if (hash < 0) return -1L; final long rangeStart = 0; final long rangeEnd = keysSize; final long startIndex = hash; assert startIndex >= rangeStart; assert startIndex < rangeEnd; return keys.linearSearch(key, rangeStart, rangeEnd, startIndex, EMPTY_KEY, false); }
/** * @param values * @param newCapacities * @param ngramOrder */ private void initMap(long newCapacity, int ngramOrder) { maps[ngramOrder] = new ExplicitWordHashMap(newCapacity); values.setSizeAtLeast(maps[ngramOrder].getCapacity(), ngramOrder); }
private long getOffsetHelpFromMap(int ngramOrder, long key) { if (isExplicit) { return (ngramOrder >= explicitMaps.length || explicitMaps[ngramOrder] == null) ? -1 : explicitMaps[ngramOrder].getOffset(key); } return ngramOrder == 0 ? implicitUnigramMap.getOffset(key) : implicitMaps[ngramOrder - 1].getOffset(key); }
@Override public boolean wordHasBigrams(final int word) { return getMaxNgramOrder() < 2 ? false : (explicitMaps == null ? implicitMaps[0].hasContexts(word) : explicitMaps[1].hasContexts(word)); }
@Override public long put(final long key) { final long hash = hash(key); if (hash < 0) return -1L; final long rangeStart = 0; final long rangeEnd = keys.size(); long i = keys.linearSearch(key, rangeStart, rangeEnd, hash, EMPTY_KEY, true); if (keys.get(i) == EMPTY_KEY) { numFilled++; } setKey(i, key); return i; }
public double getLoadFactor() { return (double) numFilled / getCapacity(); }
public final long getOffset(final long key) { final long hash = hash(key); if (hash < 0) return -1L; final long rangeStart = 0; final long rangeEnd = keys.size(); final long startIndex = hash; assert startIndex >= rangeStart; assert startIndex < rangeEnd; return keys.linearSearch(key, rangeStart, rangeEnd, startIndex, EMPTY_KEY, false); }
@Override public double getLoadFactor() { return (double) numFilled / getCapacity(); }