@Override public ObjectNearestNeighboursExact<T> create(T[] data) { return new ObjectNearestNeighboursExact<T>(data, distance); } }
@Override public int[] addAll(final List<T> d) { final int[] indexes = new int[d.size()]; for (int i = 0; i < indexes.length; i++) { indexes[i] = this.add(d.get(i)); } return indexes; }
@Override public int[] assign(T[] data) { final int[] argmins = new int[data.length]; final float[] mins = new float[data.length]; nn.searchNN(data, argmins, mins); return argmins; }
@Override public List<IntFloatPair> searchKNN(T query, int K) { // Fix for when the user asks for too many points. K = Math.min(K, pnts.size()); final BoundedPriorityQueue<IntFloatPair> queue = new BoundedPriorityQueue<IntFloatPair>(K, IntFloatPair.SECOND_ITEM_ASCENDING_COMPARATOR); // prepare working data final List<IntFloatPair> list = new ArrayList<IntFloatPair>(K + 1); for (int i = 0; i < K + 1; i++) { list.add(new IntFloatPair()); } // search return search(query, queue, list); }
@Override public int size() { return nn.size(); }
@Override public List<IntFloatPair> searchKNN(T query, int K) { // Fix for when the user asks for too many points. K = Math.min(K, pnts.size()); final BoundedPriorityQueue<IntFloatPair> queue = new BoundedPriorityQueue<IntFloatPair>(K, IntFloatPair.SECOND_ITEM_ASCENDING_COMPARATOR); // prepare working data final List<IntFloatPair> list = new ArrayList<IntFloatPair>(K + 1); for (int i = 0; i < K + 1; i++) { list.add(new IntFloatPair()); } // search return search(query, queue, list); }
@Override public ObjectNearestNeighboursExact<T> create(T[] data) { return new ObjectNearestNeighboursExact<T>(data, distance); } }
@Override public IntFloatPair searchNN(final T query) { final BoundedPriorityQueue<IntFloatPair> queue = new BoundedPriorityQueue<IntFloatPair>(1, IntFloatPair.SECOND_ITEM_ASCENDING_COMPARATOR); // prepare working data final List<IntFloatPair> list = new ArrayList<IntFloatPair>(2); list.add(new IntFloatPair()); list.add(new IntFloatPair()); return search(query, queue, list).get(0); }
@Override public void assignDistance(T[] data, int[] indices, float[] distances) { nn.searchNN(data, indices, distances); }
@Override public int[] addAll(final List<T> d) { final int[] indexes = new int[d.size()]; for (int i = 0; i < indexes.length; i++) { indexes[i] = this.add(d.get(i)); } return indexes; }
/** * Construct the assigner using the given cluster data and distance * function. * * @param data * the cluster data * @param comparison * the distance function */ @SuppressWarnings("unchecked") public ExactFeatureVectorAssigner(List<T> data, DistanceComparator<? super T> comparison) { nn = new ObjectNearestNeighboursExact<T>(data, comparison); this.ndims = data.get(0).length(); this.clz = (Class<T>) data.get(0).getClass(); }
@Override public IntFloatPair searchNN(final T query) { final BoundedPriorityQueue<IntFloatPair> queue = new BoundedPriorityQueue<IntFloatPair>(1, IntFloatPair.SECOND_ITEM_ASCENDING_COMPARATOR); // prepare working data final List<IntFloatPair> list = new ArrayList<IntFloatPair>(2); list.add(new IntFloatPair()); list.add(new IntFloatPair()); return search(query, queue, list).get(0); }
@Override public IntFloatPair assignDistance(T data) { final int[] index = new int[1]; final float[] distance = new float[1]; @SuppressWarnings("unchecked") final T[] arr = (T[]) Array.newInstance(clz, 1); arr[0] = data; nn.searchNN(arr, index, distance); return new IntFloatPair(index[0], distance[0]); }
/** * Construct the assigner using the given cluster data and distance * function. * * @param data * the cluster data * @param comparison * the distance function */ @SuppressWarnings("unchecked") public ExactFeatureVectorAssigner(T[] data, DistanceComparator<? super T> comparison) { nn = new ObjectNearestNeighboursExact<T>(data, comparison); this.ndims = data[0].length(); this.clz = (Class<T>) data.getClass().getComponentType(); }
@Override public void searchNN(final List<T> qus, int[] indices, float[] distances) { final int N = qus.size(); final BoundedPriorityQueue<IntFloatPair> queue = new BoundedPriorityQueue<IntFloatPair>(1, IntFloatPair.SECOND_ITEM_ASCENDING_COMPARATOR); // prepare working data final List<IntFloatPair> list = new ArrayList<IntFloatPair>(2); list.add(new IntFloatPair()); list.add(new IntFloatPair()); for (int n = 0; n < N; ++n) { final List<IntFloatPair> result = search(qus.get(n), queue, list); final IntFloatPair p = result.get(0); indices[n] = p.first; distances[n] = p.second; } }
/** * Construct the assigner using the given cluster data and distance * function. * * @param provider * the cluster data provider * @param comparison * the distance function */ @SuppressWarnings("unchecked") public ExactFeatureVectorAssigner(CentroidsProvider<T> provider, DistanceComparator<? super T> comparison) { final T[] centroids = provider.getCentroids(); nn = new ObjectNearestNeighboursExact<T>(centroids, comparison); this.ndims = centroids[0].length(); this.clz = (Class<T>) centroids.getClass().getComponentType(); }
@Override public void searchKNN(final List<T> qus, int K, int[][] indices, float[][] distances) { // Fix for when the user asks for too many points. K = Math.min(K, pnts.size()); final int N = qus.size(); final BoundedPriorityQueue<IntFloatPair> queue = new BoundedPriorityQueue<IntFloatPair>(K, IntFloatPair.SECOND_ITEM_ASCENDING_COMPARATOR); // prepare working data final List<IntFloatPair> list = new ArrayList<IntFloatPair>(K + 1); for (int i = 0; i < K + 1; i++) { list.add(new IntFloatPair()); } // search on each query for (int n = 0; n < N; ++n) { final List<IntFloatPair> result = search(qus.get(n), queue, list); for (int k = 0; k < K; ++k) { final IntFloatPair p = result.get(k); indices[n][k] = p.first; distances[n][k] = p.second; } } }
@Override public List<ScoredAnnotation<ANNOTATION>> annotate(final OBJECT object) { if (this.nn == null) this.nn = new ObjectNearestNeighboursExact<FEATURE>(this.features, this.comparator); final TObjectIntHashMap<ANNOTATION> selected = new TObjectIntHashMap<ANNOTATION>(); final List<FEATURE> queryfv = new ArrayList<FEATURE>(1); queryfv.add(this.extractor.extractFeature(object)); final int[][] indices = new int[1][this.k]; final float[][] distances = new float[1][this.k]; this.nn.searchKNN(queryfv, this.k, indices, distances); int count = 0; for (int i = 0; i < this.k; i++) { // Distance check if (distances[0][i] > this.threshold) { continue; } final Collection<ANNOTATION> anns = this.annotations.get(indices[0][i]); for (final ANNOTATION ann : anns) { selected.adjustOrPutValue(ann, 1, 1); count++; } } final TObjectIntIterator<ANNOTATION> iterator = selected.iterator(); final List<ScoredAnnotation<ANNOTATION>> result = new ArrayList<ScoredAnnotation<ANNOTATION>>(selected.size()); while (iterator.hasNext()) { iterator.advance(); result.add(new ScoredAnnotation<ANNOTATION>(iterator.key(), (float) iterator.value() / (float) count)); } return result; }
@Override public void searchNN(final List<T> qus, int[] indices, float[] distances) { final int N = qus.size(); final BoundedPriorityQueue<IntFloatPair> queue = new BoundedPriorityQueue<IntFloatPair>(1, IntFloatPair.SECOND_ITEM_ASCENDING_COMPARATOR); // prepare working data final List<IntFloatPair> list = new ArrayList<IntFloatPair>(2); list.add(new IntFloatPair()); list.add(new IntFloatPair()); for (int n = 0; n < N; ++n) { final List<IntFloatPair> result = search(qus.get(n), queue, list); final IntFloatPair p = result.get(0); indices[n] = p.first; distances[n] = p.second; } }
@Override public void searchKNN(final List<T> qus, int K, int[][] indices, float[][] distances) { // Fix for when the user asks for too many points. K = Math.min(K, pnts.size()); final int N = qus.size(); final BoundedPriorityQueue<IntFloatPair> queue = new BoundedPriorityQueue<IntFloatPair>(K, IntFloatPair.SECOND_ITEM_ASCENDING_COMPARATOR); // prepare working data final List<IntFloatPair> list = new ArrayList<IntFloatPair>(K + 1); for (int i = 0; i < K + 1; i++) { list.add(new IntFloatPair()); } // search on each query for (int n = 0; n < N; ++n) { final List<IntFloatPair> result = search(qus.get(n), queue, list); for (int k = 0; k < K; ++k) { final IntFloatPair p = result.get(k); indices[n][k] = p.first; distances[n][k] = p.second; } } }