@Override public boolean isValid(long[] key) { return dist.dist(v, key) <= maxDist; }
private double distToNode(long[] prefix, int bitsToIgnore) { long maskMin = (-1L) << bitsToIgnore; long maskMax = ~maskMin; long[] buf = new long[prefix.length]; for (int i = 0; i < buf.length; i++) { //if v is outside the node, return distance to closest edge, //otherwise return v itself (assume possible distance=0) long min = prefix[i] & maskMin; long max = prefix[i] | maskMax; buf[i] = min > center[i] ? min : (max < center[i] ? max : center[i]); } return distance.dist(center, buf); }
private double distToNode(long[] prefix, int bitsToIgnore) { long maskMin = (-1L) << bitsToIgnore; long maskMax = ~maskMin; long[] buf = new long[prefix.length]; for (int i = 0; i < buf.length; i++) { //if v is outside the node, return distance to closest edge, //otherwise return v itself (assume possible distance=0) long min = prefix[i] & maskMin; long max = prefix[i] | maskMax; buf[i] = min > center[i] ? min : (max < center[i] ? max : center[i]); } return distance.dist(center, buf); }
private double distToNode(long[] prefix, int bitsToIgnore) { long maskMin = (-1L) << bitsToIgnore; long maskMax = ~maskMin; long[] buf = new long[prefix.length]; for (int i = 0; i < buf.length; i++) { //if v is outside the node, return distance to closest edge, //otherwise return v itself (assume possible distance=0) long min = prefix[i] & maskMin; long max = prefix[i] | maskMax; buf[i] = min > center[i] ? min : (max < center[i] ? max : center[i]); } return distance.dist(center, buf); }
private double distToNode(long[] prefix, int bitsToIgnore) { long maskMin = (-1L) << bitsToIgnore; long maskMax = ~maskMin; long[] buf = new long[prefix.length]; for (int i = 0; i < buf.length; i++) { //if v is outside the node, return distance to closest edge, //otherwise return v itself (assume possible distance=0) long min = prefix[i] & maskMin; long max = prefix[i] | maskMax; buf[i] = min > center[i] ? min : (max < center[i] ? max : center[i]); } return distance.dist(center, buf); }
private double distToNode(long[] prefix, int bitsToIgnore) { long maskMin = (-1L) << bitsToIgnore; long maskMax = ~maskMin; long[] buf = new long[prefix.length]; for (int i = 0; i < buf.length; i++) { //if v is outside the node, return distance to closest edge, //otherwise return v itself (assume possible distance=0) long min = prefix[i] & maskMin; long max = prefix[i] | maskMax; buf[i] = min > center[i] ? min : (max < center[i] ? max : center[i]); } return distance.dist(center, buf); }
@Override public boolean isValid(int bitsToIgnore, long[] prefix) { long maskMin = (-1L) << bitsToIgnore; long maskMax = ~maskMin; long[] buf = new long[prefix.length]; for (int i = 0; i < buf.length; i++) { //if v is outside the node, return distance to closest edge, //otherwise return v itself (assume possible distance=0) long min = prefix[i] & maskMin; long max = prefix[i] | maskMax; buf[i] = min > v[i] ? min : (max < v[i] ? max : v[i]); } return dist.dist(v, buf) <= maxDist; }
private double calcDiagonal(long[] key, Node node) { //First, get min/max. long[] min = new long[dims]; long[] max = new long[dims]; long mask = (-1L) << (node.getPostLen()+1); long mask1111 = ~mask; for (int i = 0; i < dims; i++) { min[i] = key[i] & mask; max[i] = (key[i] & mask) | mask1111; } //We calculate the diagonal of the node double diagonal = distance.dist(min, max); if (diagonal <= 0 || Double.isNaN(diagonal)) { return 1; } //calc radius of inner circle return diagonal*0.5;// /Math.sqrt(dims); }
private double calcDiagonal(long[] key, Node node) { //First, get min/max. long[] min = new long[dims]; long[] max = new long[dims]; long mask = (-1L) << (node.getPostLen()+1); long mask1111 = ~mask; for (int i = 0; i < dims; i++) { min[i] = key[i] & mask; max[i] = (key[i] & mask) | mask1111; } //We calculate the diagonal of the node double diagonal = distance.dist(min, max); if (diagonal <= 0 || Double.isNaN(diagonal)) { return 1; } //calc radius of inner circle return diagonal*0.5;// /Math.sqrt(dims); }
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++; }
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++; }
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++; }
private double calcLxDistance(PhEntryDist<Object> e) { double d; if (e.getValue() instanceof Node) { Node sub = (Node) e.getValue(); d = distToNode(e.getKey(), sub.getPostLen() + 1); } else { d = distance.dist(center, e.getKey()); } return d; }
private double calcLxDistance(PhEntryDist<Object> e) { double d; if (e.getValue() instanceof Node) { Node sub = (Node) e.getValue(); d = distToNode(e.getKey(), sub.getPostLen() + 1); } else { d = distance.dist(center, e.getKey()); } return d; }
e2.setDist(d); } else { double d = distance.dist(center, e2.getKey()); e2.setDist(d);
queue.add(createEntry(e2.getKdKey(), e2.getValue(), d)); } else { double d = distance.dist(center, e2.getKdKey()); queue.add(createEntry(e2.getKdKey(), e2.getValue(), d));
queue.add(createEntry(e2.getKdKey(), e2.getValue(), d)); } else { double d = distance.dist(center, e2.getKdKey()); queue.add(createEntry(e2.getKdKey(), e2.getValue(), d));
private long[] returnAnyValue(long[] ret, long[] key, Node<T> node) { //First, get correct prefix. long mask = ((-1L) << (node.getPostLen()+1)); for (int i = 0; i < DIM; i++) { ret[i] = key[i] & mask; } NodeIteratorFullNoGC<T> ni = new NodeIteratorFullNoGC<>(DIM, ret); ni.init(node, null); while (ni.increment()) { if (ni.isNextSub()) { //traverse sub node ni.init(ni.getCurrentSubNode(), null); } else { PhEntry<T> e = ni.getCurrentPost(); //Never return closest key if we look for nMin>1 keys! if (nMin > 1 && distance.dist(key, e.getKey()) == 0) { //Never return a perfect match if we look for nMin>1 keys! //otherwise the distance is too small. continue; } System.arraycopy(e.getKey(), 0, ret, 0, key.length); return ret; } } throw new IllegalStateException(); }
private PhEntryDist<Object> createLxEntry(BSTEntry e) { //calculate distance double d; if (e.getValue() instanceof Node) { Node sub = (Node) e.getValue(); d = distToNode(e.getKdKey(), sub.getPostLen() + 1); } else { d = distance.dist(center, e.getKdKey()); } //create and return entry return createEntry(e.getKdKey(), e.getValue(), d); }
private PhEntryDist<Object> createLxEntry(BSTEntry e) { //calculate distance double d; if (e.getValue() instanceof Node) { Node sub = (Node) e.getValue(); d = distToNode(e.getKdKey(), sub.getPostLen() + 1); } else { d = distance.dist(center, e.getKdKey()); } //create and return entry return createEntry(e.getKdKey(), e.getValue(), d); }