chiark / gitweb /
routesearch: abandon higher granuarities when tables become full
[ypp-sc-tools.web-live.git] / yarrg / rssearch.c
index 74a2f4504feb0840444a3da69cbd166333010aa5..31ec3d76b7ab12b842f15cf73a309331d87c8290 100644 (file)
@@ -95,13 +95,13 @@ static double process_route(int nports, int totaldist,
 
   PotentialResult *buckets[GRANUS];
   int granui;
-  for (granui=mingranu; granui<GRANUS; granui++) {
+  for (granui=0; granui<granus; granui++) {
     PotentialResult **buckets_fin;
     int mid, fin;
     switch (granui) {
-    case 0: fin=finisle; mid=midisle; break;
+    case 0: fin=finarch; mid=midarch; break;
     case 1: fin=finisle; mid=midarch; break;
-    case 2: fin=finarch; mid=midarch; break;
+    case 2: fin=finisle; mid=midisle; break;
     default: abort();
     }
     buckets_fin= ONDEMAND(buckets_base[granui][fin], granusz_mid[granui]);
@@ -109,8 +109,8 @@ static double process_route(int nports, int totaldist,
   }
 
   if (nports>=2) {
-    if (guess[A] <= buckets[mingranu]->value[A] &&
-       guess[P] <= buckets[mingranu]->value[P]) {
+    if (guess[A] <= buckets[0]->value[A] &&
+       guess[P] <= buckets[0]->value[P]) {
       ctr_routes_bucketelim++;
       debugf(" ELIM %f %f\n", guess[A], guess[P]);
       return guess[A];
@@ -129,7 +129,7 @@ static double process_route(int nports, int totaldist,
     return value[0];
   }
 
-  for (granui=mingranu; granui<GRANUS; granui++) {
+  for (granui=granus-1; granui>=0; granui--) {
     PotentialResult *bucket= buckets[granui];
 
     if (value[A] <= bucket->value[A] &&
@@ -139,6 +139,7 @@ static double process_route(int nports, int totaldist,
     debugf(" SOMEHOW %d BEST\n",granui);
 
     fildebugf("final %d:%3d mid %d ",finarch,finisle,midarch);
+    int relevant=0;
 
     for (ap=0; ap<AP; ap++) {
       HighScoreEntry *scores= highscores[granui][ap];
@@ -170,11 +171,16 @@ static double process_route(int nports, int totaldist,
        if (pos>0) {
          scores[pos].value= value[ap];
          scores[pos].pr= bucket;
+         relevant=1;
        }
        fildebugf("@%2d", pos);
-      }
-    }
-  }
+      } /* new best */
+    } /* ap */
+    if (!relevant)
+      /* both absolute and perleague are full at this granularity,
+       * so we don't care about anything more granular */
+      granus= granui+1;
+  } /* granui */
 
   fildebugf(" route");
 
@@ -215,7 +221,7 @@ void search(int start_isle, int final_isle_spec,
 
 int nhighscores[GRANUS][AP];
 HighScoreEntry *highscores[GRANUS][AP];
-int mingranu, granusz_fin[GRANUS], granusz_mid[GRANUS];
+int granus=GRANUS, granusz_fin[GRANUS], granusz_mid[GRANUS];
 
 int narches;
 char **archnames;
@@ -254,7 +260,7 @@ void setup_search(void) {
   }
   sqlite3_finalize(archs);
 
-  granusz_fin[0]=                granusz_mid[0]= islandtablesz;
+  granusz_fin[0]=                granusz_mid[0]= narches;
   granusz_fin[1]= islandtablesz; granusz_mid[1]= narches;
-  granusz_fin[2]=                granusz_mid[2]= narches;
+  granusz_fin[2]=                granusz_mid[2]= islandtablesz;
 }