Package org.tinspin.index.covertree
Class CoverTree<T>
- java.lang.Object
-
- org.tinspin.index.covertree.CoverTree<T>
-
- All Implemented Interfaces:
Index<T>,PointIndex<T>
public class CoverTree<T> extends Object implements PointIndex<T>
A 'faster' CoverTree implementation based on the paper: "Faster Cover Trees", Mike Izbicki, Christian R. Shelton, Proceedings of the 32nd International Conference on Machine Learning, Lille, France, 2015. Changes over original algorithms: - findNearestNeighbour compares if (d(y, x) greater (d(_x_, q.point()) - q.maxdist(this))) instead of if (d(y, x) greater (d(_y_, q.point()) - q.maxdist(this))) - maxDist: - lazily calculated. - calculated while excluding subbranches that don't need to be calculated - Invalidated on modifications (should speed up remove/insert) - Algorithm 2 (insert) uses BASE=1.3: BASE*covdist(p) instead of 2*covdist(p)) - Rebalancing: - The paper proposes to sort the children on their distance to 'x' and then insert into the first one that has enough covdist. The sorting appears unnecessary because we anyway have to check all children, and finding the closest one is trivially possible without sorting. - Some optimizations for kNN which are not discussed in the paper Other: - We also implemented the kNN algorithm by Hjaltason and Samet, but it about 2x as long as our own algorithm in all scenarios we tested. TODO - Rebalancing (nearest-ancestor) - Merge Node/Point classes- Author:
- Tilmann Zäschke
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classCoverTree.CTStats
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidcheck()voidclear()Clear all entries.booleancontainsExact(double[] key)static <T> Point<T>create(double[] point, T value)static <T> CoverTree<T>create(int nDims)static <T> CoverTree<T>create(int nDims, double base, PointDistanceFunction dist)static <T> CoverTree<T>create(Point<T>[] data, double base, PointDistanceFunction distFn)intgetDepth()intgetDims()intgetNodeCount()CoverTree.CTStatsgetStats()voidinsert(double[] key, T value)Insert a point.QueryIterator<? extends PointEntry<T>>iterator()QueryIterator<PointEntry<T>>query(double[] min, double[] max)PointEntryDist<T>query1NN(double[] center)Finds the nearest neighbor.TqueryExact(double[] point)Lookup an entry, using exact match.QueryIteratorKNN<PointEntryDist<T>>queryKNN(double[] center, int k)Finds the nearest neighbor.Tremove(double[] point)Remove a point entry.intsize()StringtoString()StringtoStringTree()Tupdate(double[] oldPoint, double[] newPoint)Update the position of an entry.
-
-
-
Method Detail
-
create
public static <T> Point<T> create(double[] point, T value)
-
create
public static <T> CoverTree<T> create(int nDims)
-
create
public static <T> CoverTree<T> create(int nDims, double base, PointDistanceFunction dist)
-
create
public static <T> CoverTree<T> create(Point<T>[] data, double base, PointDistanceFunction distFn)
-
getDims
public int getDims()
-
clear
public void clear()
Description copied from interface:IndexClear all entries.
-
getStats
public CoverTree.CTStats getStats()
-
getNodeCount
public int getNodeCount()
- Specified by:
getNodeCountin interfaceIndex<T>
-
toStringTree
public String toStringTree()
- Specified by:
toStringTreein interfaceIndex<T>- Returns:
- a full string output of the tree structure with all entries
-
insert
public void insert(double[] key, T value)Description copied from interface:PointIndexInsert a point.- Specified by:
insertin interfacePointIndex<T>- Parameters:
key- pointvalue- value
-
remove
public T remove(double[] point)
Description copied from interface:PointIndexRemove a point entry.- Specified by:
removein interfacePointIndex<T>- Parameters:
point- the point- Returns:
- the value of the entry or null if the entry was not found
-
update
public T update(double[] oldPoint, double[] newPoint)
Description copied from interface:PointIndexUpdate the position of an entry.- Specified by:
updatein interfacePointIndex<T>- Parameters:
oldPoint- old positionnewPoint- new position- Returns:
- the value of the entry or null if the entry was not found
-
queryExact
public T queryExact(double[] point)
Description copied from interface:PointIndexLookup an entry, using exact match.- Specified by:
queryExactin interfacePointIndex<T>- Parameters:
point- the point- Returns:
- the value of the entry or null if the entry was not found
-
iterator
public QueryIterator<? extends PointEntry<T>> iterator()
- Specified by:
iteratorin interfacePointIndex<T>- Returns:
- An iterator over all entries.
-
query
public QueryIterator<PointEntry<T>> query(double[] min, double[] max)
- Specified by:
queryin interfacePointIndex<T>- Parameters:
min- Lower left corner of the query windowmax- Upper right corner of the query window- Returns:
- All points that lie inside the query rectangle.
-
query1NN
public PointEntryDist<T> query1NN(double[] center)
Description copied from interface:PointIndexFinds the nearest neighbor. This uses euclidean distance. Other distance types can only be specified directly on the index implementations.- Specified by:
query1NNin interfacePointIndex<T>- Parameters:
center- center point- Returns:
- the nearest neighbor
-
queryKNN
public QueryIteratorKNN<PointEntryDist<T>> queryKNN(double[] center, int k)
Description copied from interface:PointIndexFinds the nearest neighbor. This uses euclidean distance. Other distance types can only be specified directly on the index implementations.- Specified by:
queryKNNin interfacePointIndex<T>- Parameters:
center- center pointk- number of neighbors- Returns:
- list of nearest neighbors
-
containsExact
public boolean containsExact(double[] key)
-
check
public void check()
-
-