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

Annotation of OpenXM_contrib/TiGERS_0.9/exsearch.c, Revision 1.1.1.1

1.1       maekawa     1: /*
                      2: ** exsearch.c                                 Birk Huber, 4/99
                      3: **   -- exhaustive search main loop.
                      4: */
                      5: #include<stdio.h>
                      6: #include<stdlib.h>
                      7: #include "utils.h"
                      8: #include "gset.h"
                      9:
                     10:
                     11: /*
                     12: ** use next pointer in Gsets to implement a simple linked list.
                     13: ** for now stored in no particular order.
                     14: */
                     15: void insert(gset g1, gset *L){
                     16:   g1->next=*L;
                     17:   *L=g1;
                     18: }
                     19:
                     20: /*
                     21: ** determine if two gsets contain equivalent marked binomials
                     22: */
                     23: int gset_equiv(gset g1, gset g2){
                     24:   binomial p1,p2;
                     25:
                     26:   p1=gset_first(g1);
                     27:   p2=gset_first(g2);
                     28:
                     29:  while(p1!=0 && p2!=0){
                     30:   if(monomial_equal(binomial_lead(p1),binomial_lead(p2))!=TRUE) return FALSE;
                     31:   if(monomial_equal(binomial_trail(p1),binomial_trail(p2))!=TRUE) return FALSE;
                     32:   p1=binomial_next(p1);
                     33:   p2=binomial_next(p2);
                     34:  }
                     35:  if (p1!=p2) return FALSE;
                     36:  return TRUE;
                     37: }
                     38:
                     39: /*
                     40: ** check a gset against those on list untill an equivalent one is found.
                     41: ** (eventually must fix this to use ordered lists or some other more efficient
                     42: **  structure)
                     43: */
                     44: gset find(gset g1, gset L){
                     45:   gset g2=0;
                     46:   for(g2=L;g2!=0;g2=g2->next)if (gset_equiv(g1,g2)==TRUE) break;
                     47:   return g2;
                     48: }
                     49:
                     50:
                     51: /*
                     52: ** use breadth-first search of edge graph of state polytope to find all
                     53: ** grobner bases of a toric ideal.
                     54: */
                     55: extern int stats_ecounter;
                     56: int exsearch(gset g1){
                     57:   gset G1,G2,todo=0,seen=0,tmp;
                     58:   binomial b=0,btmp;
                     59:   int counter=0;
                     60:   stats_ecounter=0;
                     61:
                     62:   /* make copy of first grobner basis */
                     63:   G1=gset_new();
                     64:   for(b=gset_first(g1);b!=0;b=binomial_next(b)){
                     65:      btmp=binomial_new();
                     66:      binomial_copy(b,btmp);
                     67:      gset_insert(G1,btmp);
                     68:   }
                     69:
                     70:  insert(G1,&todo);
                     71:  gset_setfacets(G1);
                     72:  gset_id(G1)=++counter;
                     73:  vertex_print(G1);
                     74:
                     75:  while(todo!=0){
                     76:     G1=todo; todo=todo->next;
                     77:     insert(G1,&seen);
                     78:     for(b=gset_first(G1);b!=0;b=binomial_next(b)){
                     79:       if (gset_isfacet(G1,b)==TRUE && binomial_ordered(b)==TRUE){
                     80:          G2=gset_flip(G1,b);
                     81:          stats_ecounter++;
                     82:          if (find(G2,todo)==0 && find(G2,seen)==0){
                     83:             insert(G2,&todo);
                     84:             gset_setfacets(G2);
                     85:             gset_id(G2)=++counter;
                     86:             vertex_print(G2);
                     87:          }
                     88:          else gset_free(G2);
                     89:       }
                     90:     }
                     91:  }
                     92:
                     93:  while(seen!=0){
                     94:     G2=seen;
                     95:     seen=G2->next;
                     96:     gset_free(G2);
                     97:  }
                     98:
                     99: return counter;
                    100: }
                    101:
                    102:
                    103:
                    104:
                    105:
                    106:
                    107:

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