chiark / gitweb /
f99f866d2ee0e39316403e2cd682bc5e7ef98c3a
[ypp-sc-tools.web-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 #define tabdebugf printf
16
17
18 #define CTR(x)    int ctr_##x;
19 #define CTRA(x,n) int ctr_##x[n];
20   COUNTER_LIST
21 #undef CTR
22 #undef CTRA
23
24 static Bucket ****results[GRANUS];
25   /* results[GRANUS][start_isle_ix][finalisle][midisle]-> */
26
27 static pid_t debugoutpid;
28
29 int main(int argc, const char **argv) {
30   const char *arg;
31   int i, ap;
32   int granui;
33   const char *database=0;
34
35 #ifndef debug_flags
36   debug_flags= ~( dbg_sql2 );
37 #endif
38
39   for (;;) {
40     arg= *++argv;
41     if (arg[0] != '-') break;
42     if (!strcmp(arg,"-d")) {
43       database= *++argv;
44     } else if (!strcmp(arg,"-g")) {
45       granus= atoi(*++argv);
46       assert(granus>=1 && granus<=GRANUS);
47 #ifndef debug_flags
48     } else if (!strcmp(arg,"-DN")) {
49       debug_flags= 0;
50     } else if (!strcmp(arg,"-D1")) {
51       debug_flags= ~(dbg_sql2|dbg_lp|dbg_value2);
52     } else {
53 #endif
54       abort();
55     }
56   }
57
58   if (debug_flags) {
59     /* glpk insists on writing stuff to stdout, and it does buffering,
60      * so we route all our debug through it this too */
61     int realstdout;
62     sysassert( (realstdout= dup(1)) > 2 );
63     sysassert( output= fdopen(realstdout,"w") );
64
65     int pfd[2];
66     sysassert(! pipe(pfd) );
67     sysassert( (debugoutpid= fork()) >=0 );
68     if (!debugoutpid) {
69       sysassert( dup2(pfd[0],0)==0 );
70       sysassert( dup2(2,1)==1 );
71       sysassert(! close(pfd[0]) );
72       sysassert(! close(pfd[1]) );
73       sysassert(! execlp("cat","cat",(char*)0) );
74     }
75     sysassert( dup2(pfd[1],1)==1 );
76     sysassert(! close(pfd[0]) );
77     sysassert(! close(pfd[1]) );
78
79     debug_file= stdout;
80   } else {
81     output= stdout;
82     debug_file= stderr;
83   }
84
85   sysassert( !setvbuf(debug,0,_IOLBF,0) );
86
87   max_mass= atof(*argv++);
88   max_volu= atof(*argv++);
89   max_capi= atof(*argv++);
90   double loss_per_league= atof(*argv++);
91   distance_loss_factor_per_league= 1.0 - loss_per_league;
92
93   setup_sql(database);
94   setup_value();
95   setup_search();
96
97   for (i=0; i<narches; i++)
98     fprintf(output,"arch %d %s\n",i,archnames[i]);
99   fprintf(output,"setup complete, starting search\n");
100
101   arg= *argv++;
102   if (!strcmp(arg,"specific")) {
103     int ia[argc], ni=0;
104     while ((arg= *argv++))
105       ia[ni++]= atoi(arg);
106
107     double val= value_route(ni, ia, 0);
108     fprintf(output, "route value is %g\n", val);
109   } else if (!strcmp(arg,"search")) {
110     for (granui=0; granui<GRANUS; granui++)
111       MCALLOC(results[granui], argc);
112
113     max_dist= atoi(*argv++);
114
115     for (ap=0; ap<AP; ap++) {
116       int nhs= atoi(*argv++);
117       for (granui=0; granui<GRANUS; granui++) {
118         nhighscores[granui][ap]= nhs;
119         MCALLOC(highscores[granui][ap], nhs);
120       }
121     }
122     const char *final_isle_spec= *argv++;
123
124     int resultsix= 0;
125     while ((arg= argv[resultsix])) {
126       int init_isle= atoi(arg);
127
128       int final_isle;
129       if (!strcmp(final_isle_spec,"circ")) final_isle= init_isle;
130       else if (!strcmp(final_isle_spec,"any")) final_isle= -1;
131       else final_isle= atoi(final_isle_spec);
132       assert(final_isle);
133
134       Bucket ****buckets_base_io[GRANUS];
135       for (granui=0; granui<GRANUS; granui++)
136         buckets_base_io[granui]= &results[granui][resultsix];
137         
138       search(init_isle, final_isle, buckets_base_io);
139       resultsix++;
140     }
141
142     int mid, fin;
143     for (granui=0; granui<granus; granui++) {
144       fprintf(output,"\n");
145       for (i=0; i<resultsix; i++) {
146         tabdebugf("========== start #%d granui%d %s ==========\n",
147                   i, granui, argv[i]);
148         Bucket ***buckets_resultsix= results[granui][i];
149         if (!buckets_resultsix) continue;
150         tabdebugf("    ");
151         for (mid=0; mid<granusz_mid[granui]; mid++) {
152           tabdebugf("|   m%-3d   ",mid);
153         }
154         tabdebugf("\n");
155         for (fin=0; fin<granusz_fin[granui]; fin++) {
156           Bucket **buckets_fin= buckets_resultsix[fin];
157           if (!buckets_fin) continue;
158           tabdebugf("f%-3d",fin);
159           for (mid=0; mid<granusz_mid[granui]; mid++) {
160             Bucket *result= buckets_fin[mid];
161             if (!result) {
162               tabdebugf("|          ");
163             } else {
164               tabdebugf("|%5d",(int)(result->prs[A].value[A]));
165               tabdebugf(" ");
166               tabdebugf("%4d",(int)(result->prs[P].value[P]));
167             }
168           }
169           tabdebugf("\n");
170         }
171       } /* i */
172
173       for (ap=0; ap<AP; ap++) {
174         int pos;
175         fprintf(output,"============== granui%d ap=%d ==============\n",
176                 granui, ap);
177         for (pos=nhighscores[granui][ap]-1; pos>=0; pos--) {
178           HighScoreEntry *hs= &highscores[granui][ap][pos];
179           Bucket *bucket= hs->bucket;
180           if (!bucket) continue;
181           OnePotentialResult *pr= &bucket->prs[ap];
182           const int *const ports= pr->ports;
183           int nports;
184           for (nports=0; nports<MAX_ROUTELEN && ports[nports]>=0; nports++);
185           int finisle= ports[nports-1];
186           int finarch= isle2arch(finisle);
187           int midisle= ports[nports/2];
188           int midarch= route2midarch(ports,nports);
189           fprintf(output,
190                   " @%2d %c#%2d | start%3d mid%d:%3d f%d:%3d | %5d %5d %4d |",
191                   pos, "ap"[ap], nhighscores[granui][ap] - pos,
192                   ports[0], midarch,midisle, finarch,finisle,
193                   (int)hs->value, (int)pr->value[A], (int)pr->value[P]);
194           for (i=0; i<nports; i++) fprintf(output," %d",ports[i]);
195           fprintf(output,"\n");
196         } /* pos */
197       } /* ap */
198     } /* granui */
199     fprintf(output,"\n");
200
201   } else {
202     abort();
203   }
204
205 #define CTR(x) fprintf(output,"  %-30s %10d\n",#x,ctr_##x);
206 #define CTRA(x,n) for (i=0;i<n;i++) \
207   fprintf(output,"  %-27s[%d] %10d\n",#x,i,ctr_##x[i]);
208   COUNTER_LIST
209 #undef CTR
210
211   if (debug_flags) {
212     sysassert(! fclose(debug) );
213     waitpid_check_exitstatus(debugoutpid,"debug cat",1);
214   }
215   sysassert(! fclose(output) );
216
217   return 0;
218 }