public PointSet GetKNN(Point p, int K, DimWeight dw) { var pc = new PointCompare(dw, p); var heap = new MaxHeap <Point>(pc); for (int i = 0; i < pointset.Points.Count(); i++) { if (heap.Count < K) { heap.Add(pointset.Points[i]); } else if (pc.Compare(heap.GetMin(), pointset.Points[i]) > 0) { heap.ExtractDominating(); heap.Add(pointset.Points[i]); } } PointSet ps = new PointSet(p.NumDim); while (heap.Count > 0) { ps.AddPoint(heap.ExtractDominating()); } return(ps); }
private void CheckPoint(int K, MaxHeap <Point> heap, PointCompare pc) { if (heap.Count < K) { heap.Add(point); } else if (pc.Compare(heap.GetMin(), point) > 0) { heap.ExtractDominating(); heap.Add(point); } }
public PointSet GetANN(Point p, int K, int maxSearch, DimWeight dw) { this.p = p; this.K = K; this.maxSearch = maxSearch; this.dw = dw; searched = new PointSetHash(); pc = new PointCompare(dw, p); heap = new MaxHeap<Point>(pc); childHolds = new List<bool>(); mutexes = new List<Mutex>(); threadIds = new Dictionary<int, int>(); threads = new List<Thread>(); returned = new List<bool>(); nReturned = 0; for (int currNum = 0; currNum < NTrees; currNum++) { mutexes.Add(new Mutex()); childHolds.Add(false); returned.Add(false); mutexes[currNum].WaitOne(); Thread t = new Thread(new ThreadStart(searchStuff)); threadIds.Add(t.ManagedThreadId, currNum); threads.Add(t); t.Start(); } while (nReturned < NTrees) { for (int i = 0; i < NTrees; i++) { if (!returned[i]) { performAction(i); } } } cleanupThreads(); PointSet ps = new PointSet(p.NumDim); while (heap.Count > 0) { ps.AddPoint(heap.ExtractDominating()); } return ps; }
public PointSet GetANNWeighted(Point p, int K, int maxSearch, DimWeight dw) { this.p = p; this.K = K; this.maxSearch = maxSearch; this.dw = dw; searched = new PointSetHash(); pc = new PointCompare(dw, p); heap = new MaxHeap<Point>(pc); childHolds = new List<bool>(); mutexes = new List<Mutex>(); flaggedId = new HashSet<int>(); threadIds = new Dictionary<int, int>(); threads = new List<Thread>(); returned = new List<bool>(); nReturned = 0; for (int currNum = 0; currNum < NTrees; currNum++) { mutexes.Add(new Mutex()); childHolds.Add(false); returned.Add(false); mutexes[currNum].WaitOne(); Thread t = new Thread(new ThreadStart(searchStuffWeighted)); threadIds.Add(t.ManagedThreadId, currNum); threads.Add(t); t.Start(); } while (nReturned < NTrees) { int id = treeweights.GetRandomId(); bool res = performAction(treeweights.GetRandomId()); if (id >= returned.Count() || (!res && returned[id])) break; } cleanupThreads(); PointSet ps = new PointSet(p.NumDim); while (heap.Count > 0) { ps.AddPoint(heap.ExtractDominating()); } return ps; }
public PointSet GetANN(Point p, int K, int maxSearch, DimWeight dw) { var pc = new PointCompare(dw, p); var heap = new MaxHeap <Point>(pc); var searched = new PointSet(p.NumDim); SearchDown(p, K, maxSearch, dw, searched, heap, pc); PointSet ps = new PointSet(p.NumDim); while (heap.Count > 0) { ps.AddPoint(heap.ExtractDominating()); } return(ps); }
private void SearchDown(Point p, int K, int maxSearch, DimWeight dw, PointSet searched, MaxHeap <Point> heap, PointCompare pc) { if (this == null || this.point == null || searched.NPoints >= maxSearch) { return; } if (isLeaf) { CheckPoint(K, heap, pc); searched.AddPoint(point); } else { bool leftSearched; if (p.Values[splitDim] < point.Values[splitDim]) { leftChild.SearchDown(p, K, maxSearch, dw, searched, heap, pc); leftSearched = true; } else { rightChild.SearchDown(p, K, maxSearch, dw, searched, heap, pc); leftSearched = false; } // Check this point if (searched.NPoints < maxSearch) { CheckPoint(K, heap, pc); searched.AddPoint(point); } // Check if a better point possibly exists in the other subtree var pval = new List <Double>(p.Values); pval[splitDim] = point.Values[splitDim]; Point planecheck = new Point(pval); if (pc.Compare(heap.GetMin(), planecheck) >= 0) { if (leftSearched && rightChild != null) { rightChild.SearchDown(p, K, maxSearch, dw, searched, heap, pc); } else if (!leftSearched && leftChild != null) { leftChild.SearchDown(p, K, maxSearch, dw, searched, heap, pc); } } } }
public void SearchDownThreaded(Point p, int K, int maxSearch, DimWeight dw, PointSetHash searched, MaxHeap <Point> heap, PointCompare pc, List <Boolean> b, List <Mutex> m, int id) { if (this == null || this.point == null || searched.NPoints >= maxSearch) { return; } if (isLeaf) { while (b[id]) { ; } m[id].WaitOne(); b[id] = true; if (!searched.CheckContains(point) && searched.NPoints < maxSearch) { CheckPoint(K, heap, pc); searched.AddPoint(point); } m[id].ReleaseMutex(); } else { bool leftSearched; if (p.Values[splitDim] < point.Values[splitDim]) { leftChild.SearchDownThreaded(p, K, maxSearch, dw, searched, heap, pc, b, m, id); leftSearched = true; } else { rightChild.SearchDownThreaded(p, K, maxSearch, dw, searched, heap, pc, b, m, id); leftSearched = false; } // Check this point while (b[id]) { ; } m[id].WaitOne(); b[id] = true; bool exceeded = maxSearch <= searched.NPoints; if (!searched.CheckContains(point) && searched.NPoints < maxSearch) { CheckPoint(K, heap, pc); searched.AddPoint(point); } // Check if a better point possibly exists in the other subtree var pval = new List <Double>(p.Values); pval[splitDim] = point.Values[splitDim]; Point planecheck = new Point(pval); bool expandOther = pc.Compare(heap.GetMin(), planecheck) >= 0; m[id].ReleaseMutex(); if (expandOther) { if (leftSearched && rightChild != null) { rightChild.SearchDownThreaded(p, K, maxSearch, dw, searched, heap, pc, b, m, id); } else if (!leftSearched && leftChild != null) { leftChild.SearchDownThreaded(p, K, maxSearch, dw, searched, heap, pc, b, m, id); } } } }