X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=yarrg%2Frsmain.c;h=67d338b502d961dc3279874cacb1344ab173e4ba;hp=fa52f81fb6481924da98b1407a477dace851450e;hb=024f4a767b43a66e6ff004532f039b874e401b80;hpb=9e57f1e2a73c8e8d69ee616672681bee29694afe diff --git a/yarrg/rsmain.c b/yarrg/rsmain.c index fa52f81..67d338b 100644 --- a/yarrg/rsmain.c +++ b/yarrg/rsmain.c @@ -1,4 +1,29 @@ -/**/ +/* + * Route searcher - command line parsing and result printing + */ +/* + * This is part of the YARRG website, a tool for assisting + * players of Yohoho Puzzle Pirates. + * + * Copyright (C) 2009 Ian Jackson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Yohoho and Puzzle Pirates are probably trademarks of Three Rings and + * are used without permission. This program is not endorsed or + * sponsored by Three Rings. + */ #include "rscommon.h" @@ -7,40 +32,56 @@ int o_quiet= 0; double max_mass=-1, max_volu=-1, max_capi=-1; double distance_loss_factor_per_league; -int max_dist= -1; +int max_dist=-1, min_trade_maxprofit=0; FILE *debug_file; FILE *output; -DEBUG_DEFINE_SOME_DEBUGF(tableau,tabdebugf); +#define tabdebugf printf -#define CTR(x) int ctr_##x; +#define CTR(x) int ctr_##x; +#define CTRA(x,n) int ctr_##x[n]; COUNTER_LIST #undef CTR +#undef CTRA -static PotentialResult ****results; - /* results[start_isle_ix][finalisle][midisle]-> */ +static Bucket ****results[GRANUS]; + /* results[GRANUS][start_isle_ix][finalisle][midisle]-> */ static pid_t debugoutpid; int main(int argc, const char **argv) { const char *arg; - int i; + int i, ap; + int granui; + const char *database=0; + const char *concur_base=0, *concur_rhs=0; + int concur_lim=-1; #ifndef debug_flags debug_flags= ~( dbg_sql2 ); #endif - + for (;;) { arg= *++argv; if (arg[0] != '-') break; + if (!strcmp(arg,"-d")) { + database= *++argv; + } else if (!strcmp(arg,"-C")) { + concur_base= *++argv; + concur_rhs= *++argv; + concur_lim= atoi(*++argv); + } else if (!strcmp(arg,"-g")) { + granus= atoi(*++argv); + assert(granus>=1 && granus<=GRANUS); #ifndef debug_flags - if (!strcmp(arg,"-DN")) { + } else if (!strcmp(arg,"-DN")) { debug_flags= 0; - } else + } else if (!strcmp(arg,"-D1")) { + debug_flags= ~(dbg_sql2|dbg_lp|dbg_value2); #endif - { + } else { abort(); } } @@ -78,18 +119,40 @@ int main(int argc, const char **argv) { max_volu= atof(*argv++); max_capi= atof(*argv++); double loss_per_league= atof(*argv++); - - if (!loss_per_league) loss_per_league= 1e-7; distance_loss_factor_per_league= 1.0 - loss_per_league; - setup_sql(); + min_trade_maxprofit= atoi(*argv++); + + if (concur_base) { + for (i=0; i= 0); + struct flock fl; + memset(&fl,0,sizeof(fl)); + fl.l_type= F_WRLCK; + r= fcntl(concfd, F_SETLK, &fl); + free(concfn); + if (!r) goto concur_ok; + sysassert( errno == EWOULDBLOCK ); + close(concfd); + } + fprintf(output,"@@@ concurrency limit exceeded (%d)\n", concur_lim); + exit(0); + + concur_ok: + /* deliberately leak concfd */ + fprintf(output,"concurrency slot %d\n", i); + } + + setup_sql(database); setup_value(); setup_search(); for (i=0; iabsolute)); - tabdebugf(" "); - tabdebugf("%4d",(int)(result->perleague)); - } + int mid, fin; + for (granui=0; granuiprs[A].value[A])); + tabdebugf(" "); + tabdebugf("%4d",(int)(result->prs[P].value[P])); + } + } + tabdebugf("\n"); + } + } /* i */ - int pos; -#define OUT(absperl) \ - fprintf(output,"\n================== " #absperl " ==================\n"); \ - for (pos=0; pospr; \ - if (!pr) continue; \ - const int *const ports= pr->absperl##_ports; \ - int nports; \ - for (nports=0; nports=0; nports++); \ - int finisle= ports[nports-1]; int finarch= isle2arch(finisle); \ - int midarch= route2midarch(ports,nports); \ - fprintf(output, \ - " @%2d #%2d | start%3d mid%d f%d:%3d | %5d %5d %4d |", \ - pos, nhighscores_##absperl - 1 - pos, \ - ports[0], midarch, finarch,finisle, \ - (int)hs->value, (int)pr->absolute, (int)pr->perleague); \ - for (i=0; i=0; pos--) { + HighScoreEntry *hs= &highscores[granui][ap][pos]; + 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]; + int finarch= isle2arch(finisle); + int midisle= ports[nports/2]; + int midarch= route2midarch(ports,nports); + fprintf(output, + " @%2d %c#%2d | start%3d mid%d:%3d f%d:%3d" + " | %3dlg | %5d %5d %4d |", + pos, "ap"[ap], nhighscores[granui][ap] - pos, + ports[0], midarch,midisle, finarch,finisle, pr->length, + (int)hs->value, (int)pr->value[A], (int)pr->value[P]); + for (i=0; i