chiark / gitweb /
routesearch: sort out debugging output
[ypp-sc-tools.db-live.git] / yarrg / rsmain.c
1 /**/
2
3 #include "rscommon.h"
4
5 #include <ctype.h>
6
7 int o_quiet= 0;
8 double max_mass=-1, max_volu=-1, max_capi=-1;
9 double distance_loss_factor_per_league;
10 int max_dist= -1;
11
12 FILE *debug_file;
13 FILE *output;
14
15
16 #define CTR(x) int ctr_##x;
17   COUNTER_LIST
18 #undef CTR
19
20 static PotentialResult ****results;
21   /* results[start_isle_ix][finalisle][midisle]-> */
22
23 static pid_t debugoutpid;
24
25 int main(int argc, const char **argv) {
26   const char *arg;
27
28 #ifndef debug_flags
29   debug_flags= ~( dbg_sql2 );
30 #endif
31   
32   for (;;) {
33     arg= *++argv;
34     if (arg[0] != '-') break;
35 #ifndef debug_flags
36     if (!strcmp(arg,"-DN")) {
37       debug_flags= 0;
38     } else
39 #endif
40     {
41       abort();
42     }
43   }
44
45   if (debug_flags) {
46     /* glpk insists on writing stuff to stdout, and it does buffering,
47      * so we route all our debug through it this too */
48     int realstdout;
49     sysassert( (realstdout= dup(1)) > 2 );
50     sysassert( output= fdopen(realstdout,"w") );
51
52     int pfd[2];
53     sysassert(! pipe(pfd) );
54     sysassert( (debugoutpid= fork()) >=0 );
55     if (!debugoutpid) {
56       sysassert( dup2(pfd[0],0)==0 );
57       sysassert( dup2(2,1)==1 );
58       sysassert(! close(pfd[0]) );
59       sysassert(! close(pfd[1]) );
60       sysassert(! execlp("cat","cat",(char*)0) );
61     }
62     sysassert( dup2(pfd[1],1)==1 );
63     sysassert(! close(pfd[0]) );
64     sysassert(! close(pfd[1]) );
65
66     debug_file= stdout;
67   } else {
68     output= stdout;
69     debug_file= stderr;
70   }
71
72   sysassert( !setvbuf(debug,0,_IOLBF,0) );
73
74   max_mass= atof(*argv++);
75   max_volu= atof(*argv++);
76   max_capi= atof(*argv++);
77   double loss_per_league= atof(*argv++);
78
79   if (!loss_per_league) loss_per_league= 1e-7;
80   distance_loss_factor_per_league= 1.0 - loss_per_league;
81
82   setup_sql();
83   setup_value();
84   setup_search();
85
86   fprintf(stderr,"setup complete, starting search\n");
87   
88   arg= *argv++;
89   if (!strcmp(arg,"specific")) {
90     int ia[argc], ni=0;
91     while ((arg= *argv++))
92       ia[ni++]= atoi(arg);
93
94     double val= value_route(ni, ia, 0);
95     fprintf(output, "route value is %g\n", val);
96   } else if (!strcmp(arg,"search")) {
97     MCALLOC(results, argc);
98
99     max_dist= atoi(*argv++);
100     nhighscores_absolute= atoi(*argv++);
101     nhighscores_perleague= atoi(*argv++);
102     const char *final_isle_spec= *argv++;
103
104     MCALLOC(highscores_absolute, nhighscores_absolute);
105     MCALLOC(highscores_perleague, nhighscores_perleague);
106
107     int resultsix= 0;
108     while ((arg= argv[resultsix])) {
109       int init_isle= atoi(arg);
110       
111       int final_isle;
112       if (!strcmp(final_isle_spec,"circ")) final_isle= init_isle;
113       else if (!strcmp(final_isle_spec,"any")) final_isle= -1;
114       else final_isle= atoi(final_isle_spec);
115       assert(final_isle);
116
117       search(init_isle, final_isle, &results[resultsix]);
118       resultsix++;
119     }
120
121     int i, midarch, finarch;
122     for (i=0; i<resultsix; i++) {
123       fprintf(stderr,"============== start #%d %s [PARTIAL] ==============\n",
124               i, argv[i]);
125       PotentialResult ***strat_resultsix= results[i];
126       if (!strat_resultsix) continue;
127       fprintf(stderr,"  ");
128       for (midarch=0; midarch<narches; midarch++) {
129         fprintf(stderr,"|   mid %d  ",midarch);
130       }
131       fprintf(stderr,"\n");
132       for (finarch=0; finarch<narches; finarch++) {
133         PotentialResult **strat_finarch= strat_resultsix[finarch];
134         if (!strat_finarch) continue;
135         fprintf(stderr,"f%d",finarch);
136         for (midarch=0; midarch<narches; midarch++) {
137           PotentialResult *result= strat_finarch[midarch];
138           if (!result) {
139             fprintf(stderr,"|          ");
140           } else {
141             fprintf(stderr,"|%5d",(int)(result->absolute));
142             fprintf(stderr," ");
143             fprintf(stderr,"%4d",(int)(result->perleague));
144           }
145         }
146         fprintf(stderr,"\n");
147       }
148     }
149
150     int pos;
151 #define OUT(absperl)                                                          \
152     fprintf(output,"\n================== " #absperl " ==================\n"); \
153     for (pos=0; pos<nhighscores_##absperl; pos++) {                           \
154       HighScoreEntry *hs= &highscores_##absperl[pos];                         \
155       PotentialResult *pr= hs->pr;                                            \
156       if (!pr) continue;                                                      \
157       const int *const ports= pr->absperl##_ports;                            \
158       int nports;                                                             \
159       for (nports=0; nports<MAX_ROUTELEN && ports[nports]>=0; nports++);      \
160       int finisle= ports[nports-1]; int finarch= isle2arch(finisle);          \
161       int midarch= route2midarch(ports,nports);                               \
162       fprintf(output,                                                         \
163               " @%2d #%2d | start%3d mid%d f%d:%3d | %5d %5d %4d |",     \
164               pos, nhighscores_##absperl - 1 - pos,                           \
165               ports[0], midarch, finarch,finisle,                     \
166               (int)hs->value, (int)pr->absolute, (int)pr->perleague);         \
167       for (i=0; i<nports; i++) fprintf(output," %d",ports[i]);                \
168       fprintf(output,"\n");                                                   \
169     }
170     OUT(absolute)
171     OUT(perleague)
172     fprintf(output,"\n");
173     
174   } else {
175     abort();
176   }
177
178 #define CTR(x) fprintf(output,"  %-30s %10d\n",#x,ctr_##x);
179   COUNTER_LIST
180 #undef CTR
181
182   if (debug_flags) {
183     sysassert(! fclose(debug) );
184     waitpid_check_exitstatus(debugoutpid,"debug cat",1);
185   }
186   sysassert(! fclose(output) );
187
188   return 0;
189 }