public KdTreeNearestNeighbor(KdTreeSearch1<P> search, KdTreeSearchN<P> searchN, AxisSplitter<P> splitter) { this.search = search; this.searchN = searchN; this.splitter = splitter; constructor = new KdTreeConstructor<>(memory,splitter); }
/** * Creates a child by checking to see if it is a leaf or branch. */ protected KdTree.Node computeChild(List<P> points , GrowQueue_I32 indexes ) { if( points.size() == 0 ) return null; if( points.size() == 1 ) { return createLeaf(points,indexes); } else { return computeBranch(points,indexes); } }
/** * Makes sure a branch is created correctly given the results from the splitter */ @Test public void computeBranch_dontTrack() { DummySplitter splitter = createSplitter(1,1,false); splitter.splitAxis = 1; splitter.splitPoint = new double[]{2,3}; KdTreeConstructor<double[]> alg = new KdTreeConstructor<>(new KdTreeMemory(),splitter); KdTree.Node n = alg.computeBranch(new ArrayList<>(),null); assertSame(n.point, splitter.splitPoint); assertEquals(n.split, splitter.splitAxis); assertEquals(-2, n.index); // default value in splitter assertTrue(n.left.isLeaf()); assertTrue(n.right.isLeaf()); assertSame(n.left.point, splitter.left.get(0)); assertEquals(-1, n.left.index); assertSame(n.right.point, splitter.right.get(0)); assertEquals(-1, n.right.index); }
@Test public void computeChild() { KdTreeConstructor<double[]> alg = new KdTreeConstructor<>(distance); List<double[]> points = new ArrayList<>(); GrowQueue_I32 data = new GrowQueue_I32(); // empty lists should be null KdTree.Node n = new KdTree.Node(); n.point = new double[2]; n.index = 1; KdTree.Node found = alg.computeChild(points,data); assertNull(found); // add a point points.add( new double[2] ); data.add(2); found = alg.computeChild(points,data); assertTrue(found.isLeaf()); assertSame(found.point, points.get(0)); assertEquals(found.index, data.get(0)); // for all the other cases it will create a branch. testing that will require a bit more work... }
/** * Basic tests to see if it can handle different sized input lists. */ @Test public void construct() { KdTreeConstructor<double[]> alg = new KdTreeConstructor<>(new KdTreeMemory(),createSplitter(1,1,false)); // test an empty list List<double[]> points = new ArrayList<>(); KdTree tree = alg.construct(points,false); assertEquals(2, tree.N); assertNull(tree.root); // add a point points.add( new double[]{1,2}); tree = alg.construct(points,false); assertEquals(2, tree.N); assertSame(tree.root.point, points.get(0)); assertTrue(tree.root.isLeaf()); // add another point. These input points are ignored by the dummy splitter points.add( new double[]{1,2,4,5}); tree = alg.construct(points,false); assertEquals(2, tree.N); assertTrue(tree.root.left.isLeaf()); assertTrue(tree.root.right.isLeaf()); }
@Override public void setPoints(List<P> points , boolean trackIndicies ) { if( forest[0] != null ) { for( int i = 0; i < forest.length; i++ ) memory.recycleGraph(forest[i]); } for( int i = 0; i < forest.length; i++ ) forest[i] = constructor.construct(points,trackIndicies); search1.setTrees(forest); searchN.setTrees(forest); }
node.left = computeChild(left,leftIndexes); node.right = computeChild(right,rightIndexes);
/** * Same test as above but with associated data */ @Test public void computeBranch_trackIndexes() { DummySplitter splitter = createSplitter(1,1,true); splitter.splitAxis = 1; splitter.splitPoint = new double[]{2,3}; splitter.splitIndex = 2; KdTreeConstructor<double[]> alg = new KdTreeConstructor<>(new KdTreeMemory(),splitter); KdTree.Node n = alg.computeBranch(new ArrayList<>(),new GrowQueue_I32()); assertSame(n.point, splitter.splitPoint); assertEquals(n.split, splitter.splitAxis); assertEquals(n.index, splitter.splitIndex); assertTrue(n.left.isLeaf()); assertTrue(n.right.isLeaf()); assertSame(n.left.point, splitter.left.get(0)); assertEquals(n.left.index, splitter.leftIndex.get(0)); assertSame(n.right.point, splitter.right.get(0)); assertEquals(n.right.index, splitter.rightIndex.get(0)); }
@Override public void setPoints(List<P> points , boolean trackIndicies ) { if( forest[0] != null ) { for( int i = 0; i < forest.length; i++ ) memory.recycleGraph(forest[i]); } for( int i = 0; i < forest.length; i++ ) forest[i] = constructor.construct(points,trackIndicies); search1.setTrees(forest); searchN.setTrees(forest); }
node.left = computeChild(left,leftIndexes); node.right = computeChild(right,rightIndexes);
/** * Creates a child by checking to see if it is a leaf or branch. */ protected KdTree.Node computeChild(List<P> points , GrowQueue_I32 indexes ) { if( points.size() == 0 ) return null; if( points.size() == 1 ) { return createLeaf(points,indexes); } else { return computeBranch(points,indexes); } }
public KdTreeNearestNeighbor(KdTreeSearch1<P> search, KdTreeSearchN<P> searchN, AxisSplitter<P> splitter) { this.search = search; this.searchN = searchN; this.splitter = splitter; constructor = new KdTreeConstructor<>(memory,splitter); }
@Override public void setPoints(List<P> points, boolean trackIndicies) { if( tree != null ) memory.recycleGraph(tree); tree = constructor.construct(points,trackIndicies); search.setTree(tree); searchN.setTree(tree); }
/** * Creates a new {@link KdTree} from the provided points. * * WARNING: Reference to each point is saved to reduce memory usage.. * * @param points Data points. * @return KdTre */ public KdTree construct(List<P> points , boolean trackIndexes ) { GrowQueue_I32 indexes = null; if( trackIndexes ) { indexes = new GrowQueue_I32(); indexes.resize(points.size()); for (int i = 0; i < indexes.size; i++) { indexes.data[i] = i; } } KdTree tree = memory.requestTree(splitter.getPointLength()); if( points.size() == 1 ) { tree.root = createLeaf(points,indexes); } else if( points.size() > 1 ) { tree.root = computeBranch(points, indexes ); } return tree; }
public KdForestBbfSearch(int numberOfTrees, int maxNodesSearched, KdTreeDistance<P> distance , AxisSplitter<P> splitter) { this.forest = new KdTree[ numberOfTrees ]; this.splitter = splitter; this.search1 = new KdTreeSearch1Bbf<>(distance,maxNodesSearched); this.searchN = new KdTreeSearchNBbf<>(distance,maxNodesSearched); this.constructor = new KdTreeConstructor<P>(memory,splitter); }
@Override public void setPoints(List<P> points, boolean trackIndicies) { if( tree != null ) memory.recycleGraph(tree); tree = constructor.construct(points,trackIndicies); search.setTree(tree); searchN.setTree(tree); }
/** * Creates a new {@link KdTree} from the provided points. * * WARNING: Reference to each point is saved to reduce memory usage.. * * @param points Data points. * @return KdTre */ public KdTree construct(List<P> points , boolean trackIndexes ) { GrowQueue_I32 indexes = null; if( trackIndexes ) { indexes = new GrowQueue_I32(); indexes.resize(points.size()); for (int i = 0; i < indexes.size; i++) { indexes.data[i] = i; } } KdTree tree = memory.requestTree(splitter.getPointLength()); if( points.size() == 1 ) { tree.root = createLeaf(points,indexes); } else if( points.size() > 1 ) { tree.root = computeBranch(points, indexes ); } return tree; }
public KdForestBbfSearch(int numberOfTrees, int maxNodesSearched, KdTreeDistance<P> distance , AxisSplitter<P> splitter) { this.forest = new KdTree[ numberOfTrees ]; this.splitter = splitter; this.search1 = new KdTreeSearch1Bbf<>(distance,maxNodesSearched); this.searchN = new KdTreeSearchNBbf<>(distance,maxNodesSearched); this.constructor = new KdTreeConstructor<P>(memory,splitter); }