[BACK]Return to call.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / Ti

Annotation of OpenXM/src/Ti/call.c, Revision 1.1.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: int NT = 1;
                     19:
                     20: /*
                     21: ** write a description of program usage to stderr
                     22: */
                     23: usage(prog)
                     24: char *prog;
                     25: {
                     26:   static char *helpmsg[] = {
                     27:   "Function: Enumerate all Groebner bases of a toric ideal I_A.",
                     28:   "          \n",
                     29:   "Input: \n ",
                     30:   "  A) A ring description (for now just a number of variables)\n",
                     31:   "     followed by a reduced Groebner basis for I_A.\n",
                     32:   "     example:\n",
                     33:   "     R: 5\n",
                     34:   "     G: {a^2*c-b^2*e, a^2*d-b*e^2, b*d-c*e}\n",
                     35:   "  or \n",
                     36:   "  B) An integer matrix A (defining I_A).\n",
                     37:   "     example:\n",
                     38:   "     M: { 3 5 : 2 1 1 1 1 1 \n",
                     39:   "                3 0 1 2 1 0 \n",
                     40:   "                4 0 0 1 2 1}\n",
                     41:   " Note: Lines beginning with a % are comments and are ignored.\n",
                     42:   "       Comment lines should only occur at the beginning of the file.\n",
                     43:   "     : When binomials are printed out (and read in) they can be \n",
                     44:   "       preceeded by the characters !, or # \n",
                     45:   "       ! means the binomial is known not to be a facet.\n",
                     46:   "       # means the binomial is known to be a facet.\n",
                     47:   " \n",
                     48:   "Options:\n",
                     49:   "    -h            print this message\n"
                     50:   "    -i (filename) set file name for input  [default: stdin]\n",
                     51:   "    -o (filename) set file name for output [default: stdout]\n",
                     52:   "    -R            only compute root of tree \n",
                     53:   "    -r            compute all grobner bases [done by default]\n",
                     54:   "    -C            turn partial caching on   [done by default]\n",
                     55:   "    -c            turn partial caching off \n",
                     56:   "    -T            print edges of search tree \n",
                     57:   "    -t            do not print edges of search tree [assumed by default]\n",  "    -L            print vertices by giving initial ideals\n",
                     58:   "                     and printing facet biomials.\n",
                     59:   "    -l            print vertices as grobner bases   [done by default]\n",
                     60:   "    -F            Use only linear algebra when testing facets [default]\n",
                     61:   "    -f            use FLIPPABILITY test first when determining facets\n",
                     62:   "    -e            use exhaustive search instead of reverse search\n",
                     63:   "    -E            use reverse search                   [default]\n",
                     64:   NULL
                     65:   };
                     66:   char **p=helpmsg;
                     67:
                     68:   fprintf(stderr,"Usage: %s {Options} \n",prog);
                     69:   while(*p)(void) fputs(*p++,stderr);
                     70:   exit(-1);
                     71: }
                     72:
                     73: FILE *infile=stdin, *outfile=stdout;
                     74: extern int rsearch_cache;
                     75: extern int print_tree;
                     76: extern int  print_init;
                     77: extern int stats_minfacets;
                     78: extern int stats_minelts;
                     79: extern int stats_mindeg;
                     80: extern int stats_maxfacets;
                     81: extern int stats_maxelts;
                     82: extern int stats_maxdeg;
                     83: extern int stats_ecounter;
                     84: extern int stats_tdepth;
                     85: extern int lptest;
                     86: int root_only=FALSE;
                     87: int compGB=FALSE;
                     88: int use_exsearch=FALSE;
                     89:
                     90: #define MATFOUND 1
                     91: #define GSETFOUND 2
                     92: main2(int argc, char **argv ){
                     93:  char *c,cc, *prog=argv[0], *ifname=0, *ofname=0;
                     94:  int tmp,acnt,stat=0,counter;
                     95:  gset G1=0,gset_toric_ideal();
                     96:  int **M=0,Mn,Mm;
                     97:  double tt;
                     98:
                     99:   /* initialize parameters */
                    100:   root_only=FALSE;
                    101:   rsearch_cache=TRUE;
                    102:   print_tree=FALSE;
                    103:   print_init=FALSE;
                    104:
                    105:   /* parse command line */
                    106:   while (--argc > 0 && (*++argv)[0] == '-'){
                    107:     acnt=0;
                    108:     for (c = argv[0]+1; *c != '\0'; c++){
                    109:       switch (*c) {
                    110:       case 'h': usage(prog);  break;
                    111:       case 'R': root_only=TRUE; break;    /* Root Flag On */
                    112:       case 'r': root_only=FALSE; break;   /* Root Flag Off */
                    113:       case 'C': rsearch_cache=TRUE; break;/* Turn partial caching on*/
                    114:       case 'c': rsearch_cache=FALSE;break;/* Turn partical caching off*/
                    115:       case 'T': print_tree=TRUE;  break;  /* Turn tree printing on */
                    116:       case 't': print_tree=FALSE; break;  /* Turn tree printing off*/
                    117:       case 'L': print_init=TRUE;  break;  /* Turn initial ideal printing on */
                    118:       case 'l': print_init=FALSE; break;  /* Turn initial ideal printing off */
                    119:       case 'f': lptest=3; break;          /*check facets with linalg and */
                    120:                                          /*flipability tests */
                    121:       case 'F': lptest=1; break;          /*check facets only with linalg */
                    122:       case 'A': lptest=2; use_exsearch=TRUE;break;          /*check facets only for flipability*/
                    123:       case 'E': use_exsearch=FALSE;break; /*use reverse search to enumerate */
                    124:       case 'e': use_exsearch=TRUE; break; /*use exhaustive search */
                    125:       case 'i': case 'I':
                    126:          argc--;
                    127:         ifname=strdup(argv[++acnt]); /* scan infile name */
                    128:           fprintf(stderr,"using filename %s for input\n",ifname);
                    129:        break;
                    130:       case 'o': case 'O':argc--;
                    131:          ofname=strdup(argv[++acnt]); /* scan infile name */
                    132:           fprintf(stderr,"using filename %s for output\n",ofname);
                    133:        break;  /* scan outfile name */
                    134:         break;
                    135:         default:
                    136:            fprintf(stderr,"%s: illegal option %c\n",prog,*c);
                    137:       }
                    138:     }
                    139:     argv+=acnt;
                    140:   }
                    141:   if (argc != 0) usage(prog);
                    142:
                    143:   /* open infile and outfile (if nesc) */
                    144:   if (ifname!=0 && (infile=fopen(ifname,"r"))==0){
                    145:       fprintf(stderr," %s: couldn't open %s for input\n",prog,ifname);
                    146:       exit(1);
                    147:   }
                    148:   if (ofname!=0 && (outfile=fopen(ofname,"w"))==0){
                    149:       fprintf(stderr," %s: couldn't open %s for output\n",prog,ofname);
                    150:       exit(1);
                    151:   }
                    152:
                    153:   /* scan input from infile and outfile */
                    154:
                    155:   eatwhite(infile);
                    156:   cc=getc(infile);
                    157:   if (cc=='R'){
                    158:     while((cc=getc(infile))!=':');
                    159:     if (ring_read(infile)==FALSE){
                    160:      fprintf(stderr,"%s: ring_read() failed\n",prog);
                    161:      exit(1);
                    162:     }
                    163:     eatwhite(infile);
                    164:     cc=getc(infile);
                    165:   }
                    166:   if (cc=='G'){
                    167:     while((cc=getc(infile))!=':');
                    168:     if (ring_N<0) {
                    169:        fprintf(stderr,"%s: ring not set\n",prog);
                    170:        exit(1);
                    171:     }
                    172:     G1=gset_new();
                    173:     if (gset_read(infile,G1)==FALSE){
                    174:      fprintf(stderr,"%s: gset_read() failed\n",prog);
                    175:      exit(1);
                    176:     }
                    177:     stat=GSETFOUND;
                    178:   }
                    179:   else if (cc=='M'){
                    180:     while((cc=getc(infile))!=':');
                    181:     if ((M=imatrix_read(infile,&Mm,&Mn))==0){
                    182:      fprintf(stderr,"%s: imatrix_read() failed\n",prog);
                    183:      exit(1);
                    184:     }
                    185:     if (ring_N==0) ring_set(Mn);
                    186:     else if (ring_N!=Mn) {
                    187:      fprintf(stderr,"%s: Matrix collum and ring dimensions must agree\n",prog);
                    188:      exit(1);
                    189:     }
                    190:     stat=MATFOUND;
                    191:   }
                    192:   else {
                    193:    fprintf(stderr,"%s,: Input files contains neither a generating set\n",prog);
                    194:    fprintf(stderr,"     nor a matrix description of a toric ideal\n");
                    195:    exit(1);
                    196: }
                    197:
                    198:   /* ensure we have root */
                    199:   if (stat==MATFOUND){
                    200:    G1=gset_toric_ideal(M,Mm,Mn);
                    201:   }
                    202:   else {
                    203:    if (compGB==TRUE){gset_rgb(G1,monomial_lexcomp);}
                    204:    else {
                    205:      /* could put checks to make sure input is toric rgb */
                    206:      /* then use grobner walk to get to first rgb */
                    207:    }
                    208:   }
                    209:
                    210:   if (NT == 1) {
                    211:
                    212:     fprintf(outfile,"[\n");
                    213:     /* perform reverse search if desired*/
                    214:     if (root_only==FALSE){
                    215:       if (use_exsearch==FALSE){
                    216:        /* should double check we are at root */
                    217:        tt=clock();
                    218:        counter=rsearch(G1);
                    219:        tt=(clock()-tt)/CLOCKS_PER_SEC;
                    220:        fprintf(outfile,"\n");
                    221:       } else {
                    222:        tt=clock();
                    223:        counter=exsearch(G1);
                    224:        tt=(clock()-tt)/CLOCKS_PER_SEC;
                    225:        fprintf(outfile,"\n");
                    226:       }
                    227:     }
                    228:
                    229:     fprintf(outfile,"]\n");
                    230:     goto epilogue ;
                    231:   }
                    232:   /* if NT != 1, then start the followings. */
                    233:   /* output first GB if desired */
                    234:   fprintf(outfile,"%% starting GB:\n");
                    235:   fprintf(outfile,"R: %d\n",ring_N);
                    236:   fprintf(outfile,"G: ");
                    237:   gset_print(outfile,G1);
                    238:   fprintf(outfile,"\n");
                    239:
                    240:   /* perform reverse search if desired*/
                    241:   if (root_only==FALSE){
                    242:     if (use_exsearch==FALSE){
                    243:       /* should double check we are at root */
                    244:      fprintf(outfile,"\n Enumerating Groebner bases\n");
                    245:      fprintf(outfile,"   using reverse search\n");
                    246:      if (ifname!=0) fprintf(outfile,"   taking input from %s\n",ifname);
                    247:      if (rsearch_cache==FALSE) fprintf(outfile,"   without partial caching\n");
                    248:      else fprintf(outfile,"   with partial caching\n");
                    249:      switch(lptest){
                    250:      case 1:
                    251:         fprintf(outfile,"   using only linear programing to test facets\n");
                    252:         break;
                    253:      case 3:
                    254:         fprintf(outfile,"   using wall ideal pretest for facet checking\n");
                    255:         break;
                    256:      case 2:
                    257:        fprintf(stderr,"Error: can not use -A option with reverse search\n");
                    258:        break;
                    259:      }
                    260:      tt=clock();
                    261:      counter=rsearch(G1);
                    262:      tt=(clock()-tt)/CLOCKS_PER_SEC;
                    263:      fprintf(outfile,"\n");
                    264:      fprintf(outfile,"Number of Groebner bases found %d\n",counter);
                    265:      fprintf(outfile,"Number of edges of state polytope %d\n",stats_ecounter);
                    266:      fprintf(outfile,"max caching depth      %d\n",stats_tdepth);
                    267:      fprintf(outfile,"max facet binomials    %d\n",stats_maxfacets);
                    268:      fprintf(outfile,"min facet binomials    %d\n",stats_minfacets);
                    269:      fprintf(outfile,"max elts               %d\n",stats_maxelts);
                    270:      fprintf(outfile,"min elts               %d\n",stats_minelts);
                    271:      fprintf(outfile,"max degree             %d\n",stats_maxdeg);
                    272:      fprintf(outfile,"min degree             %d\n",stats_mindeg);
                    273:      if (ifname!=0) fprintf(outfile,"%s: ",ifname);
                    274:      fprintf(outfile,"Reverse Search, ");
                    275:      switch(rsearch_cache){
                    276:      case TRUE:
                    277:         fprintf(outfile,"  Caching,");
                    278:         break;
                    279:      case FALSE:
                    280:         fprintf(outfile,"  NO Caching,");
                    281:         break;
                    282:       }
                    283:      switch(lptest){
                    284:      case 1:
                    285:         fprintf(outfile,"  LP only.\n");
                    286:         break;
                    287:      case 3:
                    288:         fprintf(outfile,"  A-pretest,\n");
                    289:         break;
                    290:      }
                    291:      fprintf(outfile,"time used (in seconds) %4.2lf\n",tt);
                    292:      return 0;
                    293:     }
                    294:     else {
                    295:       fprintf(outfile,"\nEnumerating Groebner bases\n");
                    296:       fprintf(outfile,"using exhaustive searching");
                    297:       if (ifname!=0) fprintf(outfile,"taking input from %s\n",ifname);
                    298:       else fprintf(outfile,"\n");
                    299:      switch(lptest){
                    300:      case 1:
                    301:         fprintf(outfile,"   using only linear programing to test facets\n");
                    302:         break;
                    303:      case 3:
                    304:         fprintf(outfile,"   using wall ideal pretest for facet checking\n");
                    305:         break;
                    306:      case 2:
                    307:        fprintf(outfile,"Using wall ideal pretest instead of facet checking\n");
                    308:        fprintf(outfile," FINDING ALL A-GRADED INITIALS CONNECTED TO ROOT\n");
                    309:        break;
                    310:      }
                    311:      tt=clock();
                    312:      counter=exsearch(G1);
                    313:      tt=(clock()-tt)/CLOCKS_PER_SEC;
                    314:      fprintf(outfile,"\n");
                    315:      fprintf(outfile,"Number of Groebner bases found %d\n",counter);
                    316:      fprintf(outfile,"Number of edges of state polytope %d\n",stats_ecounter);
                    317:      fprintf(outfile,"max facet binomials    %d\n",stats_maxfacets);
                    318:      fprintf(outfile,"min facet binomials    %d\n",stats_minfacets);
                    319:      fprintf(outfile,"max elts               %d\n",stats_maxelts);
                    320:      fprintf(outfile,"min elts               %d\n",stats_minelts);
                    321:      fprintf(outfile,"max degree             %d\n",stats_maxdeg);
                    322:      fprintf(outfile,"min degree             %d\n",stats_mindeg);
                    323:      if (ifname!=0) fprintf(outfile,"%s: ",ifname);
                    324:      fprintf(outfile,"Exhaustive search, ");
                    325:      switch(lptest){
                    326:      case 1:
                    327:         fprintf(outfile,"  LP only\n");
                    328:         break;
                    329:      case 3:
                    330:         fprintf(outfile,"  A-pretest\n");
                    331:         break;
                    332:      case 2:
                    333:        fprintf(outfile," A-only\n");
                    334:        break;
                    335:      default:
                    336:         fprintf(outfile,"\n");
                    337:      }
                    338:      fprintf(outfile,"time used (in seconds) %4.2lf\n",tt);
                    339:     return 0;
                    340:     }
                    341:   }
                    342:
                    343:  epilogue: ;
                    344:   /* clean up */
                    345:   LP_free_space();
                    346:   if (G1!=0) gset_free(G1);
                    347: }
                    348:
                    349:
                    350: /************************    NT ***************************/
                    351: static int findNextToken(char *is, int start)
                    352: {
                    353:   if (start == -1) goto endtext ;
                    354:   while ( is[start] <= ' ') {
                    355:     if (is[start] == '\0' ) goto endtext ;
                    356:     start++;
                    357:   }
                    358:   while ( is[start] > ' ') {
                    359:     if (is[start] == '\0') goto endtext ;
                    360:     start++;
                    361:   }
                    362:   while ( is[start] <= ' ') {
                    363:     if (is[start] == '\0' ) goto endtext ;
                    364:     start++;
                    365:   }
                    366:   return(start);
                    367:  endtext: ;
                    368:   fprintf(stderr,"findNextToken: end of the text.\n");
                    369:   return(-1);
                    370: }
                    371: int **imatrix_read_from_string(char *is,int *m, int *n) {
                    372:   char c;
                    373:   int i,j;
                    374:   int **M;
                    375:   int pt = 0;
                    376:
                    377:   /*  2 3 :
                    378:       1 1 1
                    379:       0 1 2
                    380:   */
                    381:   /* read in matrix dimensions and initialize matrix */
                    382:   sscanf(is,"%d %d :",m,n);
                    383:   M=new_imatrix(*m,*n);
                    384:   pt = findNextToken(is,pt); /* n */
                    385:   pt = findNextToken(is,pt); /* : */
                    386:
                    387:   /* read in matrix entrees */
                    388:   for(i=0;i<*m;i++){
                    389:     for(j=0;j<*n;j++){
                    390:       pt = findNextToken(is,pt);
                    391:       sscanf(&(is[pt]),"%d",&(IMref(M,i,j)));
                    392:     }
                    393:   }
                    394:
                    395:   return M;
                    396: }
                    397:
                    398: tiger_executeString_M(char *is) {
                    399:   char *c,cc, *prog="tigers", *ifname=0, *ofname=0;
                    400:   int tmp,acnt,stat=0,counter;
                    401:   gset G1=0,gset_toric_ideal();
                    402:   int **M=0,Mn,Mm;
                    403:   double tt;
                    404:
                    405:   /* initialize parameters */
                    406:   root_only=FALSE;
                    407:   rsearch_cache=TRUE;
                    408:   print_tree=FALSE;
                    409:   print_init=FALSE;
                    410:
                    411:   if ((M=imatrix_read_from_string(is,&Mm,&Mn))==0){
                    412:      fprintf(stderr,"%s: imatrix_read() failed\n",prog);
                    413:      exit(1);
                    414:   }
                    415:   if (ring_N==0) ring_set(Mn);
                    416:   else if (ring_N!=Mn) {
                    417:     fprintf(stderr,"%s: Matrix collum and ring dimensions must agree\n",prog);
                    418:     exit(1);
                    419:   }
                    420:   stat=MATFOUND;
                    421:
                    422:
                    423:   /* ensure we have root */
                    424:   if (stat==MATFOUND){
                    425:    G1=gset_toric_ideal(M,Mm,Mn);
                    426:   }
                    427:
                    428:   fprintf(outfile,"[\n");
                    429:   /* perform reverse search if desired*/
                    430:   if (root_only==FALSE){
                    431:     if (use_exsearch==FALSE){
                    432:       /* should double check we are at root */
                    433:       tt=clock();
                    434:       counter=rsearch(G1);
                    435:       tt=(clock()-tt)/CLOCKS_PER_SEC;
                    436:       fprintf(outfile,"\n");
                    437:     } else {
                    438:       tt=clock();
                    439:       counter=exsearch(G1);
                    440:       tt=(clock()-tt)/CLOCKS_PER_SEC;
                    441:       fprintf(outfile,"\n");
                    442:     }
                    443:   }
                    444:
                    445:   fprintf(outfile,"]\n");
                    446:   LP_free_space();
                    447:   if (G1!=0) gset_free(G1);
                    448: }
                    449:
                    450:
                    451: main(int argc, char *argv[]) {
                    452:   if (argc > 1) {
                    453:     tiger_executeString_M(argv[1]);
                    454:   }else{
                    455:     tiger_executeString_M("2 4 : 1 1 1 1    0 1 2 3");
                    456:   }
                    457: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>