X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;ds=sidebyside;f=yarrg%2Frsmain.c;h=f99f866d2ee0e39316403e2cd682bc5e7ef98c3a;hb=8fb8cf52d2bf96beda40c30134e04a352ff988b4;hp=4b7dea9907678a6840d778d92891f919e8f2d24c;hpb=0145dc7f4fcaf62090a77fb2d69d5d7807c8d48d;p=ypp-sc-tools.main.git diff --git a/yarrg/rsmain.c b/yarrg/rsmain.c index 4b7dea9..f99f866 100644 --- a/yarrg/rsmain.c +++ b/yarrg/rsmain.c @@ -2,42 +2,217 @@ #include "rscommon.h" +#include + int o_quiet= 0; double max_mass=-1, max_volu=-1, max_capi=-1; double distance_loss_factor_per_league; int max_dist= -1; +FILE *debug_file; +FILE *output; + +#define tabdebugf printf + + +#define CTR(x) int ctr_##x; +#define CTRA(x,n) int ctr_##x[n]; + COUNTER_LIST +#undef CTR +#undef CTRA + +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, ap; + int granui; + const char *database=0; +#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,"-g")) { + granus= atoi(*++argv); + assert(granus>=1 && granus<=GRANUS); +#ifndef debug_flags + } else if (!strcmp(arg,"-DN")) { + debug_flags= 0; + } else if (!strcmp(arg,"-D1")) { + debug_flags= ~(dbg_sql2|dbg_lp|dbg_value2); + } else { +#endif + abort(); + } + } + + if (debug_flags) { + /* glpk insists on writing stuff to stdout, and it does buffering, + * so we route all our debug through it this too */ + int realstdout; + sysassert( (realstdout= dup(1)) > 2 ); + sysassert( output= fdopen(realstdout,"w") ); + + int pfd[2]; + sysassert(! pipe(pfd) ); + sysassert( (debugoutpid= fork()) >=0 ); + if (!debugoutpid) { + sysassert( dup2(pfd[0],0)==0 ); + sysassert( dup2(2,1)==1 ); + sysassert(! close(pfd[0]) ); + sysassert(! close(pfd[1]) ); + sysassert(! execlp("cat","cat",(char*)0) ); + } + sysassert( dup2(pfd[1],1)==1 ); + sysassert(! close(pfd[0]) ); + sysassert(! close(pfd[1]) ); + + debug_file= stdout; + } else { + output= stdout; + debug_file= stderr; + } + + sysassert( !setvbuf(debug,0,_IOLBF,0) ); - setup_sql(); + max_mass= atof(*argv++); + max_volu= atof(*argv++); + max_capi= atof(*argv++); + double loss_per_league= atof(*argv++); + distance_loss_factor_per_league= 1.0 - loss_per_league; + + setup_sql(database); setup_value(); setup_search(); - max_mass= atof(*++argv); - max_volu= atof(*++argv); - max_capi= atof(*++argv); - double loss_per_league= atof(*++argv); + for (i=0; iprs[A].value[A])); + tabdebugf(" "); + tabdebugf("%4d",(int)(result->prs[P].value[P])); + } + } + tabdebugf("\n"); + } + } /* i */ + + for (ap=0; ap=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 | %5d %5d %4d |", + pos, "ap"[ap], nhighscores[granui][ap] - pos, + ports[0], midarch,midisle, finarch,finisle, + (int)hs->value, (int)pr->value[A], (int)pr->value[P]); + for (i=0; i