/[projects]/dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/LookupWorker.java
ViewVC logotype

Contents of /dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/LookupWorker.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2891 - (show annotations) (download)
Sun Jan 31 22:45:03 2016 UTC (8 years, 3 months ago) by torben
File size: 4798 byte(s)
Show progress when doing distance calculations
1 package dk.daoas.adressevedligehold.afstandandenrute;
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.adressevedligehold.ServiceConfig;
18 import dk.daoas.adressevedligehold.beans.Address;
19 import dk.daoas.adressevedligehold.tasks.Task;
20
21 public class LookupWorker implements Runnable {
22
23 static final int MAX_RESULTS = 99;
24
25
26 final static Logger logger = Logger.getLogger( LookupWorker.class.toString() );
27
28 OSRMHelper osrmHelper = new OSRMHelper();
29
30 CyclicBarrier barrier;
31 Queue<Address> ikkeDaekkede;
32 Map<Short, KdTree<Address>> hoTrees;
33 Database db;
34 Constants consts;
35
36 AtomicInteger antalFundne;
37 AtomicInteger antalBeregnet;
38
39 int workerID;
40 boolean verbose;
41
42 Task task;
43
44 DistanceFunction dist = new SquareEuclideanDistanceFunction();
45
46 public LookupWorker(int workerID,
47 Task task,
48 CyclicBarrier barrier,
49 Queue<Address> ikkeDaekkede,
50 Map<Short, KdTree<Address>> hoTrees,
51 AtomicInteger antalFundne,
52 AtomicInteger antalBeregnet,
53 Database db,
54 boolean verbose,
55 Constants consts) {
56
57 this.workerID = workerID;
58 this.task = task;
59 this.barrier = barrier;
60 this.ikkeDaekkede = ikkeDaekkede;
61 this.hoTrees = hoTrees;
62 this.antalFundne = antalFundne;
63 this.antalBeregnet = antalBeregnet;
64 this.db = db;
65 this.verbose = verbose;
66 this.consts = consts;
67
68 }
69
70
71 @Override
72 public void run() {
73 System.out.println( "Worker/" + workerID + " starting");
74
75 ServiceConfig conf = ServiceConfig.getInstance();
76
77 try {
78 while ( ! ikkeDaekkede.isEmpty() ) {
79
80 if (task.isAborted()) {
81 System.out.println( "Worker/" + workerID + " aborting");
82 return;
83 }
84
85
86 Address qAddress = ikkeDaekkede.remove();
87
88 short ho = qAddress.ho;
89 KdTree<Address> addressTree = hoTrees.get(ho);
90
91 MaxHeap<Address> res = addressTree.findNearestNeighbors(qAddress.xyz, MAX_RESULTS, dist);
92 //Collection<Address> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAddress);
93 int size = res.size();
94 if (size > MAX_RESULTS ) {
95 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
96 throw new Exception("Returnerede mere end MAX_RESULTS> " + res.size());
97 }
98
99 ArrayList<Address> adrList = new ArrayList<Address>();
100
101 for (int i=0; i<size; i++) {
102 Address a = res.getMax();
103 adrList.add(a);
104 res.removeMax();
105 }
106 Address 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
107 double bedsteAfstand = GeoPointHelper.beregnAfstand(qAddress, bedsteAdr);
108
109
110 if ( conf.useOsrm == true) {
111 //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
112 if (bedsteAfstand <= consts.getMaxDistance()) {
113
114 Address bedsteAdr2 = osrmHelper.getNearestTableHttp(qAddress, adrList);
115
116 if (bedsteAdr2 != null) {
117 bedsteAdr = bedsteAdr2;
118 bedsteAfstand = GeoPointHelper.beregnAfstand(qAddress, bedsteAdr);
119 } else {
120 logger.info("OSRM returned null for " + qAddress);
121 }
122 }
123 }
124
125
126
127
128
129 if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
130 if (verbose == true) {
131 logger.fine("(" +workerID + ") Bedste: " + qAddress + "==>" + bedsteAdr + " ::: " + bedsteAfstand );
132 }
133
134 antalFundne.incrementAndGet();
135
136 try {
137 db.gemResultat(qAddress, bedsteAdr, bedsteAfstand);
138 } catch (SQLException e) {
139 logger.log(Level.WARNING, "Error saving result", e);
140 logger.warning("Shutting down");
141 throw e; // rethrow
142 }
143 } else {
144 if (verbose == true) {
145 System.out.println("For stor afstand: " + qAddress + " > " + bedsteAfstand);
146 }
147 }
148
149 antalBeregnet.incrementAndGet();
150 }
151
152 } catch (Exception e) {
153 logger.log( Level.SEVERE, "Worker/" + workerID, e);
154 task.doAbort();
155 }
156
157
158
159 try {
160 logger.info( "Worker/" + workerID + " afventer barrier");
161 barrier.await();
162 } catch (Exception e) {
163 logger.log(Level.SEVERE, e.getMessage(), e);
164 }
165
166 System.out.println( "Worker/" + workerID + " stopping");
167 }
168
169 }

  ViewVC Help
Powered by ViewVC 1.1.20