/[projects]/dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/LookupWorker.java
ViewVC logotype

Annotation of /dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/LookupWorker.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2744 - (hide annotations) (download)
Wed Oct 7 19:32:00 2015 UTC (8 years, 8 months ago) by torben
File size: 4686 byte(s)
Ny k-d tree implementation
1 torben 2711 package dk.daoas.fulddaekning;
2    
3     import java.sql.SQLException;
4 torben 2744 import java.util.ArrayList;
5 torben 2711 import java.util.Map;
6     import java.util.Queue;
7     import java.util.concurrent.BrokenBarrierException;
8     import java.util.concurrent.CyclicBarrier;
9     import java.util.concurrent.atomic.AtomicInteger;
10     import java.util.logging.Level;
11     import java.util.logging.Logger;
12    
13 torben 2744 import ags.utils.dataStructures.MaxHeap;
14     import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction;
15     import ags.utils.dataStructures.trees.thirdGenKD.KdTree;
16     import ags.utils.dataStructures.trees.thirdGenKD.SquareEuclideanDistanceFunction;
17 torben 2711 import dk.daoas.fulddaekning.osrm.OSRMHelper;
18    
19     public class LookupWorker implements Runnable {
20    
21     static final int MAX_RESULTS = 100;
22    
23    
24    
25     final static Logger logger = Logger.getLogger( LookupWorker.class.toString() );
26    
27     OSRMHelper osrmHelper = new OSRMHelper();
28    
29     CyclicBarrier barrier;
30     Queue<Adresse> ikkeDaekkede;
31     Map<Short, KdTree<Adresse>> hoTrees;
32     Database db;
33     Constants consts;
34    
35     AtomicInteger antalFundne;
36    
37     int workerID;
38     boolean verbose;
39    
40 torben 2744 DistanceFunction dist = new SquareEuclideanDistanceFunction();
41    
42 torben 2711 public LookupWorker(int workerID,
43     CyclicBarrier barrier,
44     Queue<Adresse> ikkeDaekkede,
45     Map<Short, KdTree<Adresse>> hoTrees,
46     AtomicInteger antalFundne,
47     Database db,
48     boolean verbose,
49     Constants consts) {
50    
51     this.workerID = workerID;
52     this.barrier = barrier;
53     this.ikkeDaekkede = ikkeDaekkede;
54     this.hoTrees = hoTrees;
55     this.antalFundne = antalFundne;
56     this.db = db;
57     this.verbose = verbose;
58     this.consts = consts;
59    
60     }
61    
62    
63     @Override
64     public void run() {
65     System.out.println( "Worker/" + workerID + " starting");
66    
67 torben 2722 try {
68     while ( ! ikkeDaekkede.isEmpty() ) {
69 torben 2713
70 torben 2722 Adresse qAdresse = ikkeDaekkede.remove();
71 torben 2711
72 torben 2722 short ho = qAdresse.ho;
73     KdTree<Adresse> addressTree = hoTrees.get(ho);
74 torben 2711
75 torben 2744 MaxHeap<Adresse> res = addressTree.findNearestNeighbors(qAdresse.xyz, MAX_RESULTS, dist);
76     //Collection<Adresse> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse);
77     int size = res.size();
78     if (size > MAX_RESULTS ) {
79 torben 2722 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
80     System.exit(0);
81     }
82 torben 2744
83     ArrayList<Adresse> adrList = new ArrayList<Adresse>();
84 torben 2711
85 torben 2744 for (int i=0; i<size; i++) {
86     Adresse a = res.getMax();
87     double d = res.getMaxKey();
88     adrList.add(a);
89     res.removeMax();
90    
91     System.out.println(a + " > " + d);
92     }
93     Adresse bedsteAdr = adrList.get(size-1); //da det er en max-heap er det elementet med størst distance der er først og dermed den sidste der er tættest
94     double bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
95 torben 2711
96 torben 2744 /*
97 torben 2718 //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
98     if (bedsteAfstand <= consts.getMaxDistance()) {
99 torben 2741 //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteHttp(qAdresse, res);
100     //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteJni(qAdresse, res);
101 torben 2744 Adresse bedsteAdr2 = osrmHelper.getNearestTableHttp(qAdresse, res);
102     //Adresse bedsteAdr2 = osrmHelper.getNearestTableJni(qAdresse, res);
103 torben 2722
104     if (bedsteAdr2 != null) {
105     bedsteAdr = bedsteAdr2;
106     bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
107     } else {
108     logger.info("NearestViaTable returned null for " + qAdresse);
109     }
110 torben 2718 }
111 torben 2744 */
112 torben 2711
113 torben 2718
114 torben 2711
115 torben 2718
116 torben 2711 if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
117     if (verbose == true) {
118     logger.fine("(" +workerID + ") Bedste: " + qAdresse + "==>" + bedsteAdr + " ::: " + bedsteAfstand );
119     }
120    
121     antalFundne.incrementAndGet();
122    
123     try {
124     db.gemResultat(qAdresse, bedsteAdr, bedsteAfstand);
125     } catch (SQLException e) {
126     logger.log(Level.WARNING, "Error saving result", e);
127     logger.warning("Shutting down");
128    
129     System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme
130     }
131     } else {
132     if (verbose == true) {
133     System.out.println("For stor afstand: " + qAdresse + " > " + bedsteAfstand);
134     }
135     }
136    
137 torben 2722 }
138    
139     } catch (Exception e) {
140     logger.log( Level.SEVERE, "Worker/" + workerID, e);
141 torben 2711 }
142    
143 torben 2722
144    
145 torben 2711 try {
146 torben 2722 logger.info( "Worker/" + workerID + " afventer barrier");
147 torben 2711 barrier.await();
148     } catch (BrokenBarrierException e) {
149     logger.log(Level.SEVERE, e.getMessage(), e);
150     System.exit(-1);
151     } catch(InterruptedException e) {
152 torben 2719 logger.log(Level.SEVERE, e.getMessage(), e);
153 torben 2711 }
154    
155    
156     System.out.println( "Worker/" + workerID + " stopping");
157     }
158    
159     }

  ViewVC Help
Powered by ViewVC 1.1.20