[BACK]Return to call.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / TiGERS_0.9

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>