File: class.c

package info (click to toggle)
palp 2.1-5
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,164 kB
  • sloc: ansic: 20,792; makefile: 43
file content (325 lines) | stat: -rw-r--r-- 16,895 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
/*  ======================================================================  */
/*  ==========                                                  ==========  */
/*  ==========                  C L A S S . C                   ==========  */
/*  ==========                                                  ==========  */
/*  ==========               A p r i l   2 0 0 2                ==========  */
/*  ==========                                                  ==========  */
/*  ======================================================================  */

/*      Coord   get coordinates by reading them or converting weight input
 *      Rat     rational functions
 *      Vertex  computes Vertices and Faces
 *      Subpoly subpolys, sublattices, minimality
 *      Polynf  normal form and symmetries
 *      SubAdd  sorting
 *      Subdb   data base
 *      -> poly.x class.x
 */

#include "Global.h"
#include "Subpoly.h"

#if ( POLY_Dmax * POINT_Nmax  > 83400000 )
#error		decrease POLY_Dmax or/and POINT_Nmax for compiling class
#endif

FILE *inFILE, *outFILE;

void PrintExtOptions(){puts("Extended/experimental options:");
     puts("           -d1 -d2 [-po]      combined mirror info (projected"); 
     exit(0);}
void LocalPrintUsage(char *c, char hc){
printf("This is  `%s', a program for classifying reflexive polytopes\n",c);
while (hc!='e'){
if (hc=='g'){
printf("Usage:     %s  [options] [ascii-input-file [ascii-output-file]]\n",c);
printf("Options:   -h          print this information\n           ");
puts("-f or -     use as filter; otherwise parameters denote I/O files");
puts("           -m*         various types of minimality checks (* ... lvra)");
puts("           -p* NAME    specification of a binary I/O file (* ... ioas)");
puts("           -d* NAME    specification of a binary I/O database (DB) (* ... ios)");
puts("           -r          recover: file=po-file.aux, use same pi-file");
puts("           -o[#]       original lattice [omit up to # points] only");
puts(
"           -s*         subpolytopes on various sublattices (* ... vphmbq)");
puts("           -k          keep some of the vertices");
puts("           -c, -C      check consistency of binary file or DB");
puts("           -M[M]       print missing mirrors to ascii-output");
puts("           -a[2b], -A  create binary file from ascii-input");
puts("           -b[2a], -B  ascii-output from binary file or DB");
puts("           -H*         applications related to Hodge number DBs (* ...cstfe)");
}
else if (hc=='m'){
printf("`%s -m*' reads a list of combined weight systems as ascii-input\n",c);
puts("              and writes the sublist with a particular property, ");
puts("              possibly with extra information:");
printf("`%s -ml' returns only lp-minimal CWS\n",c);
printf("`%s -mv' returns only v-minimal CWS\n",c);
printf("`%s -mr' returns only r-minimal CWS\n",c);
printf(
"`%s -ma' returns the CWS that determine reflexive polytopes, with\n",c);
puts(
"              information on the above properties and the `span property'.");
}
else if (hc=='p'){
puts("With `-p*' you specify a binary I/O file that encodes a sorted list");
puts("           of normal forms of polytopes. In particular, with");
puts("-piNAME or -pi NAME     input and with");
puts("-poNAME or -po NAME     output is specified.");
puts("-paNAME or -pa NAME     specifies a list that should be added to another ");
puts("         list given as a binary file (with -pi) or as a database (with -di).");
puts("-psNAME or -ps NAME     specifies a list that should be subtracted from");
puts("         another list given as a binary file (with -pi) .");
puts("With -pa and -ps you have to specify output via -po or -do.");
}
else if (hc=='d'){
puts("With `-d*' you specify a binary I/O database that encodes a sorted");
puts("           list of normal forms of polytopes. In particular, with");
puts("-diNAME or -di NAME     input and with");
puts("-doNAME or -do NAME     output is specified.");
puts("-dsNAME or -ds NAME     specifies a list in database format that should");
puts(
"         be subtracted from another list given as a binary file (with -pi),");
puts("         with an output file specified via -po.");
}
else if (hc=='r'){
printf("As %s sometimes requires very long running times, intermediate\n",c);
puts("results are regularly written to a file <out-file>.aux. If such a");
printf("file exists, `%s -r -po<out-file>' can be used to recover an\n",c);
printf("unfinished but terminated run of `%s -po<out-file>'.\n",c);
puts("Possible input files or databases should be identical.");
}
else if (hc=='o'){
printf("In normal mode `%s' determines reflexive subpolytopes both on\n",c);
printf("the original lattice and on sublattices. With `%s -o' you can\n",c);
puts("restrict to polytopes on the original lattice only. If you also");
puts("specify a number # via `-o#', then only the polytopes obtained by");
puts("omitting # or less lattice points are determined.");
puts("For `-o0' the recursion breaks at any reflexive polytope.");
printf("For `-oc' complete (including sublattice)");
puts(" by ignoring input polytope in list.");
}
else if (hc=='s'){
printf("`%s -s* [-di<input-db>] [-mr] -po<out-file>' polytopes on ",c);  
puts("sublattices:");  
printf("`%s -sh [-di<input-db>]' finds Calabi-Yau hypersurfaces that are free"
,c);
printf("\n             free quotients (i.e. points on codim>1 faces of ");
printf("the dual\n             polytope do not span the N-lattice). Input ");
printf("can be ascii or DB.\n");
printf(
"`%s -sp [-di<input-db>]' same as `-sh' except that it is checked whether",
  c);
puts("\n             all points of the dual span the N lattice.");
printf("`%s -sv [-di<input-db>] [-mr] -po<out-file>' serves to determine\n",c);
printf("             on which sublattices of the original lattice a given ");
printf("polytope is\n             still a lattice polytope. Input can be "); 
printf("ascii or database. In the\n             former case all sublattice ");
printf("polytopes are determined and in the\n             latter case only ");
printf("those not yet in the database. With the option\n             `-mr' ");
printf("the result, which is written to <out-file>, is\n             ");
puts("restricted to r-maximal polytopes.");
printf("`%s -sm [-di<input-db>] [-mr] -po<out-file>' same as `-sv' but ",c);
printf("now all\n             reflexive polytopes that have the same pairing");
puts(" matrix between\n             vertices and equations are constructed");
puts(
"In addition there are the somewhat experimental options -sb, -sq for dim=4.");
puts("They are similar to -sh, -sp, with the relationship summarized by");
puts("	-sh ... generated by codim>1 points (omit IPs of facets)");
puts("	-sp ... generated by all points");
puts("	-sb ... generated by dim<=1 (edges), print if rank=2	");
puts("	-sq ... generated by vertices,       print if rank=3	");
}
else if (hc=='k'){
printf(
"`%s -k* [-di<input-db>] -po<out-file>' gives you a list of the vertices \n",
c);
puts("   of the input polytope and asks which of them should be kept;");
puts(
"   all reflexive subpolytopes containing the kept vertices are determined.");}
else if (hc=='c'){
printf(
"`%s -c' (or `-C') checks the consistency of a binary file or database\n",c);
puts("specified via `-pi' or `-di'."); 
puts("`-C' results in a more detailed output than `-c'");
}
else if (hc=='M'){
printf("`%s -M[M]' looks for polytopes in a list specified by `-pi' or\n",c);
puts("`-di' whose mirrors are not in the same list. The resulting `missing");
puts("mirrors' are written in ascii format.");
}
else if (hc=='a'){
printf(
"`%s -a[2b] -po<out-file>' converts ascii-input of reflexive polytopes\n",c);
puts("to binary file format.");
puts("If an input file or database is specified via `-pi' or `-di', only");
puts("the polytopes not in one of these lists are written to <out-file>.");
puts("If an ascii output file is explicitly specified, weights corresponding");
puts("to new polytopes are written to that file.");
puts("-A[2B] converts non-reflexive ascii input to binary file format.");
}
else if (hc=='b'){
printf("`%s -b[2a]' converts binary input to a list of normal forms in\n",c);
puts("ascii format. For file input (specified via `-pi') all normal forms of");
puts("polytopes on original lattices are displayed, but for database input");
puts("(`-di') the normal forms of the sublattice polytopes in the database");
puts("are shown. If no sublattice polytopes are left, then all polytopes ");
puts("in the database are displayed.");
puts("For non-reflexive binary input, -B[2A] should be used for conversion");
puts("to ascii format.");
}
else if (hc=='H'){
puts(
"Options of the type `-H*' are used for handling Hodge number databases");
puts("and work only for polytopes of dimension four. In particular,");
printf("`%s -Hc [-vf#] [-vt#] -di<DB> -do<Hodge-DB>' calculates the\n",c);
puts("   Hodge numbers of the polytopes in DB and creates a Hodge number");
puts("   database whose files correspond to fixed vertex numbers and Euler");
puts("   numbers. If -vf and/or -vt are specified, only the Hodge numbers");
puts("   of the polytopes whose vertex numbers are in the corresponding");
puts("   (from/to) range are determined.");
printf(
"`%s -Hs -di<Hodge-DB> [-do<Hodge-DB>]' sorts a Hodge-DB resulting\n",c);
puts("   from -Hc to one consisting of files of fixed Hodge number pairs");
puts("   (with the same name if -do is omitted),");
printf("`%s  -Ht -di<Hodge-DB>'  tests a Hodge-DB for consistency and\n",c);
printf("`%s  -Hf -pi<Hodge-DB-file>' serves for testing a Hodge-DB-file.\n",c);
printf("`%s  -He<search-string> -di<Hodge-DB>' extracts data on \n",c);
puts("   polytopes (in ascii) from a Hodge-DB. A search string may take"); 
puts("   the form `E#H#:#M#V#N#F#L#', where the #'s denote numbers:"); 
puts("      E...Euler characteristic, H#:#...Hodge numbers h11,h12,"); 
puts("      M/V/N/F...numbers of points/vertices/dual points/facets,"); 
puts("      L...Limit on the total number of polytopes displayed."); 
puts("   The ordering is inessential and if a value isn't specified the"); 
puts("   corresponding symbol may be omitted. For example, `-He:1'"); 
puts("   leads to a search for all polytopes with h12=1.");
puts("   Unless at least one of h11, h12, E is specified, the search will");
puts("   take quite long.");
}
else if (hc=='I'){
printf("There are three basic types of I/O structures for %s:\n",c);
puts("ascii files, binary files and binary databases.");
puts("   Binary files and databases always encode ordered lists of normal");
puts("forms of polytopes, and any such structure created by some application");
printf("of %s may be used as input for some other application of %s.\n",c,c);
puts(
"   A database consists of various files NAME.<extension> and is specified");
puts("via `-d* NAME'. It contains one ascii file and several binary files.");
puts("   Ascii input should always correspond to a list of polytopes given");
puts("either by combined weight systems or by lists of lattice points.");
puts("Weight input is specified by a single line of the form");
printf("   d1 w11 w12 ... d2 w21 w22 ... [comments ignored by %s]\n",c);
puts("with sum_j wij=di for every i.");
puts("Lattice point input is specified by a line of the form");
printf("   #colums #lines [comments ignored by %s]\n",c);
puts("followed by (#lines) lines each of which has (#colums) integers such");
puts("that the resulting matrix encodes the coordinates of the polytope");
puts("with lattice points given either as row or as column vectors.");
puts("Sometimes ascii output may also be used as input.");
}
puts("");
puts(
"Type one of [m,p,d,r,o,s,c,M,a,b,H] for help on options,");
printf(
"`g' for general help, `I' for general information on I/O or `e' to exit: ");
scanf("%s",&hc);
puts("");
}
}


int  main (int narg, char* fn[])
{ int n=0, FilterFlag=0, oFlag=0, cFlag=0, rFlag=0, abFlag=0, kFlag=0,
    vf=2, vt=VERT_Nmax-1;
  char Blank=0, *dbin=&Blank, *dbsub=&Blank, *dbout=dbin, *x_string=&Blank,
    *polyi=dbin, *polya=dbin, *polys=dbin, *polyo=dbin, mFlag=0, HFlag=0,
    sFlag=0; static CWS W; PolyPointList *_P;
  if(narg==1) {puts("\nFor help type `class.x -h'\n");exit(0);}
  _P = (PolyPointList *) malloc(sizeof (PolyPointList));
  if(_P==NULL) {puts("Unable to allocate space for _P"); exit(0);}

  while(narg > ++n)
    if(fn[n][0]!='-') break;
    else switch(fn[n][1])
      { case 'h':               LocalPrintUsage(fn[0],'g');     exit(0);
        case 'f': case  0 :     FilterFlag=1;                   break;
        case 'm':               mFlag=fn[n][2];                 break;
        case 's':               sFlag=fn[n][2];                 break;
        case 'c':               cFlag=1;                        break;
        case 'C':               cFlag=2;                        break;
        case 'M':               cFlag=-1;                       break;
        case 'r':               rFlag=1;                        break;
        case 'a':               abFlag=1;                       break;
        case 'b':               abFlag=-1;                      break;
        case 'A':               abFlag=2;                       break;
        case 'B':               abFlag=-2;                      break;
        case 'k':               kFlag=1;                        break;
        case 'H': {             HFlag=fn[n][2]; 
	    if(HFlag=='e') x_string = (fn[n][3]) ? &fn[n][3] : fn[++n];  }
                                                                break;
        case 'p':
        {        if(fn[n][2]=='i') polyi = (fn[n][3]) ? &fn[n][3] : fn[++n];
            else if(fn[n][2]=='a') polya = (fn[n][3]) ? &fn[n][3] : fn[++n];
            else if(fn[n][2]=='s') polys = (fn[n][3]) ? &fn[n][3] : fn[++n];
            else if(fn[n][2]=='o') polyo = (fn[n][3]) ? &fn[n][3] : fn[++n];
            else { LocalPrintUsage(fn[0],'g'); exit(0); }
        }                                                       break;
        case 'd':
        {        if(fn[n][2]=='i') dbin  = (fn[n][3]) ? &fn[n][3] : fn[++n];
            else if(fn[n][2]=='s') dbsub = (fn[n][3]) ? &fn[n][3] : fn[++n];
            else if(fn[n][2]=='o') dbout = (fn[n][3]) ? &fn[n][3] : fn[++n];
            else { LocalPrintUsage(fn[0], 'g'); exit(0); }
        }                                                       break;
        case 'o':       oFlag=-1;             /* original lattice only */
                if(fn[n][2])
		  if(fn[n][2]=='c'){oFlag=-3;puts("complete data");}
		  else {assert(('0'<=fn[n][2])&&(fn[n][2]<='9'));
		  oFlag=atoi(&fn[n][2]);
		  if (!oFlag) {oFlag=-2; puts("break recursion at RPs");}
		  else printf("rec-dep<=%d\n",oFlag);}
                else printf("original lattices only\n");        break;
        case 'v': {
          if(fn[n][2]=='f') vf=atoi((fn[n][3]) ? &fn[n][3] : fn[++n]);
          if(fn[n][2]=='t') vt=atoi((fn[n][3]) ? &fn[n][3] : fn[++n]);}
                                                                break;
	case 'x':	PrintExtOptions();			break;
        default:        printf("Unknown flag %s !!\n",fn[n]); exit(0);
      }
  n--;

  if(FilterFlag)      { inFILE=NULL; outFILE=stdout;     }
  else
    {   if (narg > ++n)  inFILE=fopen(fn[n],"r");  else inFILE=stdin;
        if (inFILE==NULL){printf("Input file %s not found!\n",fn[n]);exit(0);}
        if (narg > ++n) outFILE=fopen(fn[n],"w");  else outFILE=stdout;
    }

       if(sFlag)          VPHM_Sublat_Polys(sFlag,mFlag,dbin,polyi,polyo,_P);
  else if(abFlag==1)	  Ascii_to_Binary(&W,_P,dbin,polyi,polyo);
  else if(abFlag==-1)	  Bin_2_ascii(polyi,dbin,(mFlag=='r'),vf,vt,_P);
  else if(abFlag==2)      Gen_Ascii_to_Binary(&W,_P,dbin,polyi,polyo);
  else if(abFlag==-2)     Gen_Bin_2_ascii(polyi,dbin,(mFlag=='r'),vf,vt,_P);
  else if(cFlag)          Check_NF_Order(polyi,dbin,cFlag,_P);
  else if(mFlag=='a')     while(Read_CWS_PP(&W,_P)) Overall_check(&W,_P);
  else if(mFlag=='r')     while(Read_CWS_PP(&W,_P)) Max_check(&W,_P);
  else if(mFlag=='v')     while(Read_CWS_PP(&W,_P)) DPvircheck(&W,_P);
  else if(mFlag=='l')     while(Read_CWS_PP(&W,_P)) DPircheck(&W,_P);

#if (POLY_Dmax < 6)
  else if(HFlag=='c')     DB_to_Hodge(dbin, dbout, vf, vt,_P);
  else if(HFlag=='s')     Sort_Hodge(dbin, dbout);
  else if(HFlag=='f')     Test_Hodge_file(polyi,_P);
  else if(HFlag=='t')     Test_Hodge_db(dbin);
  else if(HFlag=='e')     Extract_from_Hodge_db(dbin,x_string,_P);
#else
  if(HFlag !=0) {puts("For using Hodge-DB-routines set POLY_Dmax=4!"); exit(0);}
#endif

  else if(*dbin&&!*polyo) Add_Polya_2_DBi(dbin,polya,dbout);
  else if(*dbout)         Polyi_2_DBo(polyi,dbout);
  else if(*polya)         Add_Polya_2_Polyi(polyi,polya,polyo);
  else if(*polys||*dbsub) Reduce_Aux_File(polyi,polys,dbsub,polyo);
  else Do_the_Classification(&W,_P, /* fn[0], */ oFlag,rFlag,kFlag,
				polyi,polyo,dbin);
  return 0;
}