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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2744 - (show annotations) (download)
Wed Oct 7 19:32:00 2015 UTC (8 years, 7 months ago) by torben
File size: 4686 byte(s)
Ny k-d tree implementation
1 package dk.daoas.fulddaekning;
2
3 import java.sql.SQLException;
4 import java.util.ArrayList;
5 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 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 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 DistanceFunction dist = new SquareEuclideanDistanceFunction();
41
42 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 try {
68 while ( ! ikkeDaekkede.isEmpty() ) {
69
70 Adresse qAdresse = ikkeDaekkede.remove();
71
72 short ho = qAdresse.ho;
73 KdTree<Adresse> addressTree = hoTrees.get(ho);
74
75 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 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
80 System.exit(0);
81 }
82
83 ArrayList<Adresse> adrList = new ArrayList<Adresse>();
84
85 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
96 /*
97 //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
98 if (bedsteAfstand <= consts.getMaxDistance()) {
99 //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteHttp(qAdresse, res);
100 //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteJni(qAdresse, res);
101 Adresse bedsteAdr2 = osrmHelper.getNearestTableHttp(qAdresse, res);
102 //Adresse bedsteAdr2 = osrmHelper.getNearestTableJni(qAdresse, res);
103
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 }
111 */
112
113
114
115
116 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 }
138
139 } catch (Exception e) {
140 logger.log( Level.SEVERE, "Worker/" + workerID, e);
141 }
142
143
144
145 try {
146 logger.info( "Worker/" + workerID + " afventer barrier");
147 barrier.await();
148 } catch (BrokenBarrierException e) {
149 logger.log(Level.SEVERE, e.getMessage(), e);
150 System.exit(-1);
151 } catch(InterruptedException e) {
152 logger.log(Level.SEVERE, e.getMessage(), e);
153 }
154
155
156 System.out.println( "Worker/" + workerID + " stopping");
157 }
158
159 }

  ViewVC Help
Powered by ViewVC 1.1.20