X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=yarrg%2Frssearch.c;h=31ec3d76b7ab12b842f15cf73a309331d87c8290;hp=bb84785eef12f3c6ac11819c00511246623482c9;hb=e0e0711ed505eb9de89ac5a26848b30785e58816;hpb=6ab7c759c0aab39bfaf8275041dd39f45062399c diff --git a/yarrg/rssearch.c b/yarrg/rssearch.c index bb84785..31ec3d7 100644 --- a/yarrg/rssearch.c +++ b/yarrg/rssearch.c @@ -38,7 +38,7 @@ static Neighbour *get_neighbours(int isle) { } -static PotentialResult ***strat_base[STRATS]; +static PotentialResult ***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[minstrat][A][0].value && - guess[P] <= highscores[minstrat][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,25 +93,25 @@ static double process_route(int nports, int totaldist, int midisle= ports[nports/2]; int midarch= route2midarch(ports,nports); - PotentialResult *strats[STRATS]; - int strati; - for (strati=minstrat; strati=2) { - if (guess[A] <= strats[minstrat]->value[A] && - guess[P] <= strats[minstrat]->value[P]) { - ctr_routes_stratelim++; + 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,33 +129,34 @@ static double process_route(int nports, int totaldist, return value[0]; } - for (strati=minstrat; strati=0; granui--) { + PotentialResult *bucket= buckets[granui]; - if (value[A] <= strat->value[A] && - value[P] <= strat->value[P]) + if (value[A] <= bucket->value[A] && + value[P] <= bucket->value[P]) continue; - debugf(" SOMEHOW %d BEST\n",strati); + debugf(" SOMEHOW %d BEST\n",granui); fildebugf("final %d:%3d mid %d ",finarch,finisle,midarch); + int relevant=0; for (ap=0; apvalue[ap]) { + if (value[ap] < bucket->value[ap]) { debugf(" "); } else { int pos; - ctr_newbests_strat[ap]++; - strat->value[ap]= value[ap]; - memcpy(strat->ports[ap], ports, sizeof(*ports) * nports); - if (nports < MAX_ROUTELEN-1) strat->ports[ap][nports]= -1; + 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; fildebugf("** "); for (pos=0; pos < *nscores; pos++) - if (scores[pos].pr == strat) goto found; + if (scores[pos].pr == bucket) goto found; /* not found */ pos= -1; found: @@ -169,12 +170,17 @@ static double process_route(int nports, int totaldist, pos--; if (pos>0) { scores[pos].value= value[ap]; - scores[pos].pr= strat; + 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"); @@ -203,18 +209,19 @@ static void recurse(int last_isle, } void search(int start_isle, int final_isle_spec, - PotentialResult ****strat_base_io[STRATS]) { - int strati; - for (strati=0; strati