private PhEntryDist<Object> createEntry(long[] key, Object val, double dist) { if (pool.isEmpty()) { return new PhEntryDist<Object>(key, val, dist); } PhEntryDist<Object> e = pool.remove(pool.size() - 1); e.setKeyInternal(key); e.set(val, dist); return e; }
private void clearEntries() { resultSize = 0; for (int i = 0; i < entries.size(); i++) { entries.get(i).clear(); } }
private void search(int k) { while (!queue.isEmpty()) { PhEntryDist<T> candidate = queue.poll(); if (!candidate.hasNodeInternal()) { Node node = (Node) candidate.getNodeInternal(); candidateBuffer.clear(); iterNode.init(node, candidateBuffer, candidate.getKey()); for (int i = 0; i < candidateBuffer.size(); i++) { PhEntryDist<T> e2 = candidateBuffer.get(i); if (e2.hasNodeInternal()) { Node sub = (Node) e2.getNodeInternal(); double d = distToNode(e2.getKey(), sub.getPostLen() + 1); e2.setDist(d); } else { double d = distance.dist(center, e2.getKey()); e2.setDist(d);
@SuppressWarnings("unchecked") private void readValue(long[] kdKey, Object value, KnnResultList<T> resultList) { PhEntryDist<T> result = resultList.phGetTempEntry(); if (value instanceof Node) { Node sub = (Node) value; System.arraycopy(kdKey, 0, result.getKey(), 0, kdKey.length); result.setNodeInternal(sub); } else { System.arraycopy(kdKey, 0, result.getKey(), 0, kdKey.length); //ensure that 'node' is set to null result.setValueInternal((T) value); } resultList.phOffer(result); }
private void addEntry(PhEntry<T> e, long[] center) { double dist = distance.dist(center, e.getKey()); if (resultSize < entries.size()) { entries.get(resultSize).set(e, dist); } else { PhEntryDist<T> de = new PhEntryDist<>(e, dist); entries.add(de); } resultSize++; }
@Override public T nextValue() { return nextEntryReuse().getValue(); }
@Override public long[] nextKey() { return nextEntryReuse().getKey(); }
/** * Ensure a valid candidate at top of LxQueue. * @param k */ private void validateLxQueue(int k) { //Check with estimated distance. Ensure that there is no candidate in queueEst that may be //closer that the first candidate in queueLx. while (!queueEst.isEmpty() && (queueLx.isEmpty() || queueEst.peek().dist() <= queueLx.peek().dist())) { //move to queueLx PhEntryDist<Object> entry = queueEst.poll(); entry.setDist(calcLxDistance(entry)); queueLx.add( entry ); } }
e.setCopyKey(val, pht.get(val), 0); checker.set(val, distance, Double.MAX_VALUE); results.phOffer(e); PhEntry<T> e = itEx.nextEntryReuse(); PhEntryDist<T> e2 = results.getFreeEntry(); e2.set(e, distance.dist(val, e.getKey())); checker.set(val, distance, Double.MAX_VALUE); results.phOffer(e2);
@Override public PhEntryDist<T> nextEntry() { return new PhEntryDist<T>(nextEntryReuse()); }
private void clearEntries() { resultSize = 0; for (int i = 0; i < entries.size(); i++) { entries.get(i).setDist(Double.MAX_VALUE); } //TODO clear if size > 2*nMax? }
@SuppressWarnings("unchecked") private void readValue(int posInNode, long hcPos, KnnResultList<T> resultList) { if (node.values()[posInNode] == null) { return; } PhEntryDist<T> result = resultList.phGetTempEntry(); long[] key = result.getKey(); System.arraycopy(prefix, 0, key, 0, prefix.length); //The key is the current (and future) prefix as well as key of key-value Object v = node.getEntryPIN(posInNode, hcPos, key, key); if (v == null) { throw new IllegalStateException(); } if (v instanceof Node) { result.setNodeInternal(v); } else { //ensure that 'node' is set to null result.setValueInternal((T) v ); } resultList.phOffer(result); }
private void addEntry(PhEntry<T> e, long[] center) { double dist = distance.dist(center, e.getKey()); if (resultSize < entries.size()) { entries.get(resultSize).set(e, dist); } else { PhEntryDist<T> de = new PhEntryDist<>(e, dist); entries.add(de); } resultSize++; }
@Override public T nextValue() { return nextEntryReuse().getValue(); }
@Override public long[] nextKey() { return nextEntryReuse().getKey(); }