Annotation of OpenXM_contrib/TiGERS_0.9/call.c, Revision 1.1
1.1 ! maekawa 1: /*
! 2: ** call.c Birk Huber, 2/99
! 3: ** -- main calling file for tigers code
! 4: **
! 5: **
! 6: ** TiGERS, Toric Groebner Basis Enumeration by Reverse Search
! 7: ** copyright (c) 1999 Birk Huber
! 8: **
! 9: */
! 10: #include<stdio.h>
! 11: #include<stdlib.h>
! 12: #include<string.h>
! 13: #include<time.h>
! 14: #include "utils.h"
! 15: #include "gset.h"
! 16: #include "matrices.h"
! 17:
! 18: /*
! 19: ** write a description of program usage to stderr
! 20: */
! 21: usage(prog)
! 22: char *prog;
! 23: {
! 24: static char *helpmsg[] = {
! 25: "Function: Enumerate all Groebner bases of a toric ideal I_A.",
! 26: " \n",
! 27: "Input: \n ",
! 28: " A) A ring description (for now just a number of variables)\n",
! 29: " followed by a reduced Groebner basis for I_A.\n",
! 30: " example:\n",
! 31: " R: 5\n",
! 32: " G: {a^2*c-b^2*e, a^2*d-b*e^2, b*d-c*e}\n",
! 33: " or \n",
! 34: " B) An integer matrix A (defining I_A).\n",
! 35: " example:\n",
! 36: " M: { 3 5 : 2 1 1 1 1 1 \n",
! 37: " 3 0 1 2 1 0 \n",
! 38: " 4 0 0 1 2 1}\n",
! 39: " Note: Lines beginning with a % are comments and are ignored.\n",
! 40: " Comment lines should only occur at the beginning of the file.\n",
! 41: " : When binomials are printed out (and read in) they can be \n",
! 42: " preceeded by the characters !, or # \n",
! 43: " ! means the binomial is known not to be a facet.\n",
! 44: " # means the binomial is known to be a facet.\n",
! 45: " \n",
! 46: "Options:\n",
! 47: " -h print this message\n"
! 48: " -i (filename) set file name for input [default: stdin]\n",
! 49: " -o (filename) set file name for output [default: stdout]\n",
! 50: " -R only compute root of tree \n",
! 51: " -r compute all grobner bases [done by default]\n",
! 52: " -C turn partial caching on [done by default]\n",
! 53: " -c turn partial caching off \n",
! 54: " -T print edges of search tree \n",
! 55: " -t do not print edges of search tree [assumed by default]\n", " -L print vertices by giving initial ideals\n",
! 56: " and printing facet biomials.\n",
! 57: " -l print vertices as grobner bases [done by default]\n",
! 58: " -F Use only linear algebra when testing facets [default]\n",
! 59: " -f use FLIPPABILITY test first when determining facets\n",
! 60: " -e use exhaustive search instead of reverse search\n",
! 61: " -E use reverse search [default]\n",
! 62: NULL
! 63: };
! 64: char **p=helpmsg;
! 65:
! 66: fprintf(stderr,"Usage: %s {Options} \n",prog);
! 67: while(*p)(void) fputs(*p++,stderr);
! 68: exit(-1);
! 69: }
! 70:
! 71: FILE *infile=stdin, *outfile=stdout;
! 72: extern int rsearch_cache;
! 73: extern int print_tree;
! 74: extern int print_init;
! 75: extern int stats_minfacets;
! 76: extern int stats_minelts;
! 77: extern int stats_mindeg;
! 78: extern int stats_maxfacets;
! 79: extern int stats_maxelts;
! 80: extern int stats_maxdeg;
! 81: extern int stats_ecounter;
! 82: extern int stats_tdepth;
! 83: extern int lptest;
! 84: int root_only=FALSE;
! 85: int compGB=FALSE;
! 86: int use_exsearch=FALSE;
! 87:
! 88: #define MATFOUND 1
! 89: #define GSETFOUND 2
! 90: main(int argc, char **argv ){
! 91: char *c,cc, *prog=argv[0], *ifname=0, *ofname=0;
! 92: int tmp,acnt,stat=0,counter;
! 93: gset G1=0,gset_toric_ideal();
! 94: int **M=0,Mn,Mm;
! 95: double tt;
! 96:
! 97: /* initialize parameters */
! 98: root_only=FALSE;
! 99: rsearch_cache=TRUE;
! 100: print_tree=FALSE;
! 101: print_init=FALSE;
! 102:
! 103: /* parse command line */
! 104: while (--argc > 0 && (*++argv)[0] == '-'){
! 105: acnt=0;
! 106: for (c = argv[0]+1; *c != '\0'; c++){
! 107: switch (*c) {
! 108: case 'h': usage(prog); break;
! 109: case 'R': root_only=TRUE; break; /* Root Flag On */
! 110: case 'r': root_only=FALSE; break; /* Root Flag Off */
! 111: case 'C': rsearch_cache=TRUE; break;/* Turn partial caching on*/
! 112: case 'c': rsearch_cache=FALSE;break;/* Turn partical caching off*/
! 113: case 'T': print_tree=TRUE; break; /* Turn tree printing on */
! 114: case 't': print_tree=FALSE; break; /* Turn tree printing off*/
! 115: case 'L': print_init=TRUE; break; /* Turn initial ideal printing on */
! 116: case 'l': print_init=FALSE; break; /* Turn initial ideal printing off */
! 117: case 'f': lptest=3; break; /*check facets with linalg and */
! 118: /*flipability tests */
! 119: case 'F': lptest=1; break; /*check facets only with linalg */
! 120: case 'A': lptest=2; use_exsearch=TRUE;break; /*check facets only for flipability*/
! 121: case 'E': use_exsearch=FALSE;break; /*use reverse search to enumerate */
! 122: case 'e': use_exsearch=TRUE; break; /*use exhaustive search */
! 123: case 'i': case 'I':
! 124: argc--;
! 125: ifname=strdup(argv[++acnt]); /* scan infile name */
! 126: fprintf(stderr,"using filename %s for input\n",ifname);
! 127: break;
! 128: case 'o': case 'O':argc--;
! 129: ofname=strdup(argv[++acnt]); /* scan infile name */
! 130: fprintf(stderr,"using filename %s for output\n",ofname);
! 131: break; /* scan outfile name */
! 132: break;
! 133: default:
! 134: fprintf(stderr,"%s: illegal option %c\n",prog,*c);
! 135: }
! 136: }
! 137: argv+=acnt;
! 138: }
! 139: if (argc != 0) usage(prog);
! 140:
! 141: /* open infile and outfile (if nesc) */
! 142: if (ifname!=0 && (infile=fopen(ifname,"r"))==0){
! 143: fprintf(stderr," %s: couldn't open %s for input\n",prog,ifname);
! 144: exit(1);
! 145: }
! 146: if (ofname!=0 && (outfile=fopen(ofname,"w"))==0){
! 147: fprintf(stderr," %s: couldn't open %s for output\n",prog,ofname);
! 148: exit(1);
! 149: }
! 150:
! 151: /* scan input from infile and outfile */
! 152:
! 153: eatwhite(infile);
! 154: cc=getc(infile);
! 155: if (cc=='R'){
! 156: while((cc=getc(infile))!=':');
! 157: if (ring_read(infile)==FALSE){
! 158: fprintf(stderr,"%s: ring_read() failed\n",prog);
! 159: exit(1);
! 160: }
! 161: eatwhite(infile);
! 162: cc=getc(infile);
! 163: }
! 164: if (cc=='G'){
! 165: while((cc=getc(infile))!=':');
! 166: if (ring_N<0) {
! 167: fprintf(stderr,"%s: ring not set\n",prog);
! 168: exit(1);
! 169: }
! 170: G1=gset_new();
! 171: if (gset_read(infile,G1)==FALSE){
! 172: fprintf(stderr,"%s: gset_read() failed\n",prog);
! 173: exit(1);
! 174: }
! 175: stat=GSETFOUND;
! 176: }
! 177: else if (cc=='M'){
! 178: while((cc=getc(infile))!=':');
! 179: if ((M=imatrix_read(infile,&Mm,&Mn))==0){
! 180: fprintf(stderr,"%s: imatrix_read() failed\n",prog);
! 181: exit(1);
! 182: }
! 183: if (ring_N==0) ring_set(Mn);
! 184: else if (ring_N!=Mn) {
! 185: fprintf(stderr,"%s: Matrix collum and ring dimensions must agree\n",prog);
! 186: exit(1);
! 187: }
! 188: stat=MATFOUND;
! 189: }
! 190: else {
! 191: fprintf(stderr,"%s,: Input files contains neither a generating set\n",prog);
! 192: fprintf(stderr," nor a matrix description of a toric ideal\n");
! 193: exit(1);
! 194: }
! 195:
! 196: /* ensure we have root */
! 197: if (stat==MATFOUND){
! 198: G1=gset_toric_ideal(M,Mm,Mn);
! 199: }
! 200: else {
! 201: if (compGB==TRUE){gset_rgb(G1,monomial_lexcomp);}
! 202: else {
! 203: /* could put checks to make sure input is toric rgb */
! 204: /* then use grobner walk to get to first rgb */
! 205: }
! 206: }
! 207:
! 208: /* output first GB if desired */
! 209: fprintf(outfile,"%% starting GB:\n");
! 210: fprintf(outfile,"R: %d\n",ring_N);
! 211: fprintf(outfile,"G: ");
! 212: gset_print(outfile,G1);
! 213: fprintf(outfile,"\n");
! 214:
! 215: /* perform reverse search if desired*/
! 216: if (root_only==FALSE){
! 217: if (use_exsearch==FALSE){
! 218: /* should double check we are at root */
! 219: fprintf(outfile,"\n Enumerating Groebner bases\n");
! 220: fprintf(outfile," using reverse search\n");
! 221: if (ifname!=0) fprintf(outfile," taking input from %s\n",ifname);
! 222: if (rsearch_cache==FALSE) fprintf(outfile," without partial caching\n");
! 223: else fprintf(outfile," with partial caching\n");
! 224: switch(lptest){
! 225: case 1:
! 226: fprintf(outfile," using only linear programing to test facets\n");
! 227: break;
! 228: case 3:
! 229: fprintf(outfile," using wall ideal pretest for facet checking\n");
! 230: break;
! 231: case 2:
! 232: fprintf(stderr,"Error: can not use -A option with reverse search\n");
! 233: break;
! 234: }
! 235: tt=clock();
! 236: counter=rsearch(G1);
! 237: tt=(clock()-tt)/CLOCKS_PER_SEC;
! 238: fprintf(outfile,"\n");
! 239: fprintf(outfile,"Number of Groebner bases found %d\n",counter);
! 240: fprintf(outfile,"Number of edges of state polytope %d\n",stats_ecounter);
! 241: fprintf(outfile,"max caching depth %d\n",stats_tdepth);
! 242: fprintf(outfile,"max facet binomials %d\n",stats_maxfacets);
! 243: fprintf(outfile,"min facet binomials %d\n",stats_minfacets);
! 244: fprintf(outfile,"max elts %d\n",stats_maxelts);
! 245: fprintf(outfile,"min elts %d\n",stats_minelts);
! 246: fprintf(outfile,"max degree %d\n",stats_maxdeg);
! 247: fprintf(outfile,"min degree %d\n",stats_mindeg);
! 248: if (ifname!=0) fprintf(outfile,"%s: ",ifname);
! 249: fprintf(outfile,"Reverse Search, ");
! 250: switch(rsearch_cache){
! 251: case TRUE:
! 252: fprintf(outfile," Caching,");
! 253: break;
! 254: case FALSE:
! 255: fprintf(outfile," NO Caching,");
! 256: break;
! 257: }
! 258: switch(lptest){
! 259: case 1:
! 260: fprintf(outfile," LP only.\n");
! 261: break;
! 262: case 3:
! 263: fprintf(outfile," A-pretest,\n");
! 264: break;
! 265: }
! 266: fprintf(outfile,"time used (in seconds) %4.2lf\n",tt);
! 267: return 0;
! 268: }
! 269: else {
! 270: fprintf(outfile,"\nEnumerating Groebner bases\n");
! 271: fprintf(outfile,"using exhaustive searching");
! 272: if (ifname!=0) fprintf(outfile,"taking input from %s\n",ifname);
! 273: else fprintf(outfile,"\n");
! 274: switch(lptest){
! 275: case 1:
! 276: fprintf(outfile," using only linear programing to test facets\n");
! 277: break;
! 278: case 3:
! 279: fprintf(outfile," using wall ideal pretest for facet checking\n");
! 280: break;
! 281: case 2:
! 282: fprintf(outfile,"Using wall ideal pretest instead of facet checking\n");
! 283: fprintf(outfile," FINDING ALL A-GRADED INITIALS CONNECTED TO ROOT\n");
! 284: break;
! 285: }
! 286: tt=clock();
! 287: counter=exsearch(G1);
! 288: tt=(clock()-tt)/CLOCKS_PER_SEC;
! 289: fprintf(outfile,"\n");
! 290: fprintf(outfile,"Number of Groebner bases found %d\n",counter);
! 291: fprintf(outfile,"Number of edges of state polytope %d\n",stats_ecounter);
! 292: fprintf(outfile,"max facet binomials %d\n",stats_maxfacets);
! 293: fprintf(outfile,"min facet binomials %d\n",stats_minfacets);
! 294: fprintf(outfile,"max elts %d\n",stats_maxelts);
! 295: fprintf(outfile,"min elts %d\n",stats_minelts);
! 296: fprintf(outfile,"max degree %d\n",stats_maxdeg);
! 297: fprintf(outfile,"min degree %d\n",stats_mindeg);
! 298: if (ifname!=0) fprintf(outfile,"%s: ",ifname);
! 299: fprintf(outfile,"Exhaustive search, ");
! 300: switch(lptest){
! 301: case 1:
! 302: fprintf(outfile," LP only\n");
! 303: break;
! 304: case 3:
! 305: fprintf(outfile," A-pretest\n");
! 306: break;
! 307: case 2:
! 308: fprintf(outfile," A-only\n");
! 309: break;
! 310: default:
! 311: fprintf(outfile,"\n");
! 312: }
! 313: fprintf(outfile,"time used (in seconds) %4.2lf\n",tt);
! 314: return 0;
! 315: }
! 316: }
! 317: /* clean up */
! 318: LP_free_space();
! 319: if (G1!=0) gset_free(G1);
! 320: }
! 321:
! 322:
! 323:
! 324:
! 325:
! 326:
! 327:
! 328:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>