From b0df3bd887cce71fdbd60332b89db0a076b1ee4e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 15 Oct 2009 19:55:18 +0100 Subject: [PATCH] routesearch: rework some things, bugfixes Debugging: New value2 debug flag, new option -D1 for medium debug output, etc. Rename PotentialResult to a Bucket of two OnePotentialResults (no intended change in behaviour for this) Fix granularity full test to work correctly --- yarrg/rscommon.h | 13 +++++++---- yarrg/rsmain.c | 25 +++++++++++--------- yarrg/rssearch.c | 59 +++++++++++++++++++++++++----------------------- yarrg/rssql.c | 7 +++--- yarrg/rsvalue.c | 6 ++++- yarrg/x.gdb | 3 ++- 6 files changed, 65 insertions(+), 48 deletions(-) diff --git a/yarrg/rscommon.h b/yarrg/rscommon.h index 84fad6f..66e36d9 100644 --- a/yarrg/rscommon.h +++ b/yarrg/rscommon.h @@ -7,6 +7,7 @@ DF(sql) \ DF(sql2) \ DF(value) \ + DF(value2) \ DF(search) \ DF(filter) \ DF(check) \ @@ -120,12 +121,16 @@ void setup_value(void); typedef struct { double value[AP]; - int ports[AP][MAX_ROUTELEN]; -} PotentialResult; + int ports[MAX_ROUTELEN]; +} OnePotentialResult; + +typedef struct { + OnePotentialResult prs[AP]; +} Bucket; void setup_search(void); void search(int start_isle, int final_isle /* -1 means any */, - PotentialResult ****buckets_base_io[GRANUS] + Bucket ****buckets_base_io[GRANUS] /* bucket_base[granui][finalthing][midthing]-> */); extern double max_mass, max_volu, max_capi; @@ -162,7 +167,7 @@ extern FILE *output; typedef struct { double value; - PotentialResult *pr; + Bucket *bucket; } HighScoreEntry; extern int granus; diff --git a/yarrg/rsmain.c b/yarrg/rsmain.c index eaa16c5..a784ae3 100644 --- a/yarrg/rsmain.c +++ b/yarrg/rsmain.c @@ -21,7 +21,7 @@ FILE *output; #undef CTR #undef CTRA -static PotentialResult ****results[GRANUS]; +static Bucket ****results[GRANUS]; /* results[GRANUS][start_isle_ix][finalisle][midisle]-> */ static pid_t debugoutpid; @@ -41,6 +41,8 @@ int main(int argc, const char **argv) { #ifndef debug_flags if (!strcmp(arg,"-DN")) { debug_flags= 0; + } else if (!strcmp(arg,"-D1")) { + debug_flags= ~(dbg_sql2|dbg_lp|dbg_value2); } else #endif { @@ -126,7 +128,7 @@ int main(int argc, const char **argv) { else final_isle= atoi(final_isle_spec); assert(final_isle); - PotentialResult ****buckets_base_io[GRANUS]; + Bucket ****buckets_base_io[GRANUS]; for (granui=0; granuivalue[A])); + tabdebugf("|%5d",(int)(result->prs[A].value[A])); tabdebugf(" "); - tabdebugf("%4d",(int)(result->value[P])); + tabdebugf("%4d",(int)(result->prs[P].value[P])); } } tabdebugf("\n"); @@ -171,9 +173,10 @@ int main(int argc, const char **argv) { granui, ap); for (pos=nhighscores[granui][ap]-1; pos>=0; pos--) { HighScoreEntry *hs= &highscores[granui][ap][pos]; - PotentialResult *pr= hs->pr; - if (!pr) continue; - const int *const ports= pr->ports[ap]; + Bucket *bucket= hs->bucket; + if (!bucket) continue; + OnePotentialResult *pr= &bucket->prs[ap]; + const int *const ports= pr->ports; int nports; for (nports=0; nports=0; nports++); int finisle= ports[nports-1]; diff --git a/yarrg/rssearch.c b/yarrg/rssearch.c index 31ec3d7..23d2ece 100644 --- a/yarrg/rssearch.c +++ b/yarrg/rssearch.c @@ -38,7 +38,7 @@ static Neighbour *get_neighbours(int isle) { } -static PotentialResult ***buckets_base[GRANUS]; +static Bucket ***buckets_base[GRANUS]; static double process_route(int nports, int totaldist, @@ -79,8 +79,8 @@ static double process_route(int nports, int totaldist, return guess[A]; } - if (guess[A] <= highscores[GRANUS-1][A][0].value && - guess[P] <= highscores[GRANUS-1][P][0].value) { + if (guess[A] <= highscores[granus-1][A][0].value && + guess[P] <= highscores[granus-1][P][0].value) { ctr_routes_quickelim++; debugf(" QELIM %f %f\n", guess[A], guess[P]); return guess[A]; @@ -93,10 +93,10 @@ static double process_route(int nports, int totaldist, int midisle= ports[nports/2]; int midarch= route2midarch(ports,nports); - PotentialResult *buckets[GRANUS]; + Bucket *buckets[GRANUS]; int granui; for (granui=0; granui=2) { - if (guess[A] <= buckets[0]->value[A] && - guess[P] <= buckets[0]->value[P]) { + if (guess[A] <= buckets[0]->prs[A].value[A] && + guess[P] <= buckets[0]->prs[P].value[P]) { ctr_routes_bucketelim++; debugf(" ELIM %f %f\n", guess[A], guess[P]); return guess[A]; @@ -130,39 +130,39 @@ static double process_route(int nports, int totaldist, } for (granui=granus-1; granui>=0; granui--) { - PotentialResult *bucket= buckets[granui]; + Bucket *bucket= buckets[granui]; - if (value[A] <= bucket->value[A] && - value[P] <= bucket->value[P]) + if (value[A] <= bucket->prs[A].value[A] && + value[P] <= bucket->prs[P].value[P]) continue; debugf(" SOMEHOW %d BEST\n",granui); - fildebugf("final %d:%3d mid %d ",finarch,finisle,midarch); - int relevant=0; + fildebugf("granu %d f%d:%3d mid%d:%3d ",granui, + finarch,finisle,midarch,midisle); for (ap=0; apvalue[ap]) { + if (value[ap] < bucket->prs[ap].value[ap]) { debugf(" "); } else { int pos; ctr_newbests_granu[granui*AP+ap]++; - bucket->value[ap]= value[ap]; - memcpy(bucket->ports[ap], ports, sizeof(*ports) * nports); - if (nports < MAX_ROUTELEN-1) bucket->ports[ap][nports]= -1; + memcpy(bucket->prs[ap].value, value, sizeof(value)); + memcpy(bucket->prs[ap].ports, ports, sizeof(*ports) * nports); + if (nports < MAX_ROUTELEN-1) bucket->prs[ap].ports[nports]= -1; fildebugf("** "); - for (pos=0; pos < *nscores; pos++) - if (scores[pos].pr == bucket) goto found; + for (pos=0; pos < nscores; pos++) + if (scores[pos].bucket == bucket) goto found; /* not found */ pos= -1; found: for (;;) { pos++; - if (pos >= *nscores-1) break; /* new top */ + if (pos >= nscores-1) break; /* new top */ if (scores[pos].value >= value[ap]) break; /* found spot */ if (pos>0) scores[pos-1]= scores[pos]; @@ -170,16 +170,19 @@ static double process_route(int nports, int totaldist, pos--; if (pos>0) { scores[pos].value= value[ap]; - scores[pos].pr= bucket; - relevant=1; + scores[pos].bucket= bucket; + if (granui < granus-1 && + highscores[granui][A][0].bucket && + highscores[granui][P][0].bucket) { + /* both absolute and perleague are full at this granularity, + * so we don't care about anything more granular */ + fildebugf("\n STOP-GRANU "); + granus= granui+1; + } } - fildebugf("@%2d", pos); + fildebugf("@%2d/%2d ", pos, nscores); } /* 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"); @@ -209,7 +212,7 @@ static void recurse(int last_isle, } void search(int start_isle, int final_isle_spec, - PotentialResult ****buckets_base_io[GRANUS]) { + Bucket ****buckets_base_io[GRANUS]) { int granui; for (granui=0; granuiu +#break rssearch.c:179 if ports[0]==24 && ports[1]==21 run -- 2.30.2