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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupWorker.java revision 2712 by torben, Sun Sep 27 19:46:01 2015 UTC dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/LookupWorker.java revision 2797 by torben, Tue Dec 29 13:11:20 2015 UTC
# Line 1  Line 1 
1  package dk.daoas.fulddaekning;  package dk.daoas.fulddaekning;
2    
3  import java.sql.SQLException;  import java.sql.SQLException;
4  import java.util.Collection;  import java.util.ArrayList;
5  import java.util.Map;  import java.util.Map;
6  import java.util.Queue;  import java.util.Queue;
7  import java.util.concurrent.BrokenBarrierException;  import java.util.concurrent.BrokenBarrierException;
# Line 10  import java.util.concurrent.atomic.Atomi Line 10  import java.util.concurrent.atomic.Atomi
10  import java.util.logging.Level;  import java.util.logging.Level;
11  import java.util.logging.Logger;  import java.util.logging.Logger;
12    
13  import com.jwetherell.algorithms.data_structures.KdTree;  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;  import dk.daoas.fulddaekning.osrm.OSRMHelper;
18    
19  public class LookupWorker implements Runnable {  public class LookupWorker implements Runnable {
20    
21          static final int MAX_RESULTS = 100;          static final int MAX_RESULTS = 99;
22    
23    
24    
# Line 29  public class LookupWorker implements Run Line 31  public class LookupWorker implements Run
31          Map<Short, KdTree<Adresse>> hoTrees;          Map<Short, KdTree<Adresse>> hoTrees;
32          Database db;          Database db;
33          Constants consts;          Constants consts;
34            ProgressBar progressBar;
35                    
36          AtomicInteger antalFundne;          AtomicInteger antalFundne;
37    
38          int workerID;          int workerID;
39          boolean verbose;          boolean verbose;
40                    
41            DistanceFunction dist = new SquareEuclideanDistanceFunction();
42            
43          public LookupWorker(int workerID,          public LookupWorker(int workerID,
44                                  CyclicBarrier barrier,                                  CyclicBarrier barrier,
45                                  Queue<Adresse> ikkeDaekkede,                                  Queue<Adresse> ikkeDaekkede,
# Line 42  public class LookupWorker implements Run Line 47  public class LookupWorker implements Run
47                                  AtomicInteger antalFundne,                                  AtomicInteger antalFundne,
48                                  Database db,                                  Database db,
49                                  boolean verbose,                                  boolean verbose,
50                                  Constants consts) {                                  Constants consts,
51                                    ProgressBar progressBar) {
52                                    
53                  this.workerID = workerID;                  this.workerID = workerID;
54                  this.barrier = barrier;                  this.barrier = barrier;
# Line 52  public class LookupWorker implements Run Line 58  public class LookupWorker implements Run
58                  this.db = db;                  this.db = db;
59                  this.verbose = verbose;                  this.verbose = verbose;
60                  this.consts = consts;                  this.consts = consts;
61                    this.progressBar = progressBar;
62                                    
63          }          }
64    
# Line 60  public class LookupWorker implements Run Line 67  public class LookupWorker implements Run
67          public void run() {          public void run() {
68                  System.out.println( "Worker/" + workerID + " starting");                  System.out.println( "Worker/" + workerID + " starting");
69    
70                  for (Adresse qAdresse : ikkeDaekkede) {                  try {
71                            while ( ! ikkeDaekkede.isEmpty() ) {
72                            
73                                    Adresse qAdresse = ikkeDaekkede.remove();
74    
75                                    short ho = qAdresse.ho;
76                                    KdTree<Adresse> addressTree = hoTrees.get(ho);
77    
78                                    MaxHeap<Adresse> res = addressTree.findNearestNeighbors(qAdresse.xyz, MAX_RESULTS, dist);
79                                    //Collection<Adresse> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse);
80                                    int size = res.size();
81                                    if (size > MAX_RESULTS ) {
82                                            System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
83                                            System.exit(0);
84                                    }
85                                    
86                                    ArrayList<Adresse> adrList = new ArrayList<Adresse>();
87    
88                          short ho = qAdresse.ho;                                  for (int i=0; i<size; i++) {
89                          KdTree<Adresse> addressTree = hoTrees.get(ho);                                          Adresse a = res.getMax();
90                                            adrList.add(a);
91                                            res.removeMax();
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    
                         Collection<Adresse> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse);  
                         if (res.size() > MAX_RESULTS ) {  
                                 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );  
                                 System.exit(0);  
                         }  
96    
97                            if ( LookupMain.use_osrm == true) {
98                                    //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
99                                    if (bedsteAfstand <= consts.getMaxDistance()) {
100                                            //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteHttp(qAdresse, res);  
101                                            Adresse bedsteAdr2 = osrmHelper.getNearestTableHttp(qAdresse, adrList);
102      
103                                            if (bedsteAdr2 != null) {
104                                                    bedsteAdr = bedsteAdr2;
105                                                    bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
106                                            } else {
107                                                    logger.info("OSRM returned null for " + qAdresse);
108                                            }
109                                    }
110                            }
111    
                         Adresse bedsteAdr = osrmHelper.getNearestViaTable(qAdresse, res);  
                         //System.out.println("Bedste:" + bedsteAdr );  
112    
113                          double bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);                          
114    
115    
116                          if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren                          if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
# Line 98  public class LookupWorker implements Run Line 133  public class LookupWorker implements Run
133                                          System.out.println("For stor afstand: " + qAdresse + " > " + bedsteAfstand);                                          System.out.println("For stor afstand: " + qAdresse + " > " + bedsteAfstand);
134                                  }                                  }
135                          }                          }
136                    
137                            progressBar.tick();
138    
139                            }
140    
141                    } catch (Exception e) {
142                            logger.log( Level.SEVERE, "Worker/" + workerID, e);
143                  }                  }
144    
145    
146    
147                  try {                  try {
148                            logger.info( "Worker/" + workerID + " afventer barrier");
149                          barrier.await();                          barrier.await();
150                  } catch (BrokenBarrierException e) {                  } catch (BrokenBarrierException e) {
151                          logger.log(Level.SEVERE, e.getMessage(), e);                          logger.log(Level.SEVERE, e.getMessage(), e);
152                          System.exit(-1);                          System.exit(-1);
153                  } catch(InterruptedException e) {                  } catch(InterruptedException e) {
154                          //Do nothing                          logger.log(Level.SEVERE, e.getMessage(), e);
155                  }                  }
156    
157    

Legend:
Removed from v.2712  
changed lines
  Added in v.2797

  ViewVC Help
Powered by ViewVC 1.1.20