[BACK]Return to gradedset.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan

Annotation of OpenXM/src/kan96xx/Kan/gradedset.c, Revision 1.1.1.1

1.1       maekawa     1: #include <stdio.h>
                      2: #include "datatype.h"
                      3: #include "extern2.h"
                      4: #include "gradedset.h"
                      5:
                      6: #define INITSIZE 2  /* 2 is for debug */
                      7: static int Debug=0;
                      8:
                      9: struct polySet *newPolySet(n)
                     10: int n;
                     11: {
                     12:   struct polySet *g;
                     13:   int i;
                     14:   g = (struct polySet *)sGC_malloc(sizeof(struct polySet));
                     15:   g->g = (POLY *)sGC_malloc(sizeof(POLY)*(n+1));
                     16:   g->del = (int *)sGC_malloc(sizeof(int)*(n+1));
                     17:   g->syz = (struct syz0 **)sGC_malloc(sizeof(struct syz0 *)*(n+1));
                     18:   g->mark = (int *)sGC_malloc(sizeof(int)*(n+1));
                     19:   g->serial = (int *)sGC_malloc(sizeof(int)*(n+1));
                     20:   if (g->g == (POLY *)NULL || g->del == (int *)NULL ||
                     21:       g->syz == (struct syz0 **)NULL || g->mark == (int *)NULL ||
                     22:       g->serial == (int *)NULL) {
                     23:     errorGradedSet("No more memory.");
                     24:   }
                     25:   g->lim = n;
                     26:   g->size = 0;
                     27:   for (i=0; i<n; i++) g->del[i] = g->mark[i] = 0;
                     28:   if (Debug) printf("newPolySet(%d)\n",n);
                     29:   return(g);
                     30: }
                     31:
                     32: struct pair *newPair(prev)
                     33: struct pair *prev;
                     34: {
                     35:   struct pair *g;
                     36:   int i;
                     37:   g = (struct pair *) sGC_malloc(sizeof(struct pair));
                     38:   if (g == (struct pair *)NULL) errorGradedSet("No more memory.");
                     39:   g->lcm = ZERO;
                     40:   g->ig = g->ii = -1;
                     41:   g->jg = g->ji = -1;
                     42:   g->next = (struct pair *)NULL;
                     43:   g->prev = (struct pair *)NULL;
                     44:   g->del = 0;
                     45:   return(g);
                     46: }
                     47:
                     48: struct gradedPolySet *newGradedPolySet(n)
                     49: int n;
                     50: {
                     51:   struct gradedPolySet *g;
                     52:   g = (struct gradedPolySet *)sGC_malloc(sizeof(struct gradedPolySet));
                     53:   if (g == (struct gradedPolySet *)NULL) errorGradedSet("No more memory.");
                     54:   g->polys = (struct polySet **)sGC_malloc(sizeof(struct polySet *)*(n+1));
                     55:   if (g->polys == (struct polySet **)NULL)
                     56:     errorGradedSet("No more memory.");
                     57:   g->maxGrade = 0;
                     58:   g->lim = n;
                     59:   return(g);
                     60: }
                     61:
                     62: struct gradedPairs *newGradedPairs(n)
                     63: int n;
                     64: {
                     65:   struct gradedPairs *g;
                     66:   int i;
                     67:   g = (struct gradedPairs *)sGC_malloc(sizeof(struct gradedPairs));
                     68:   if (g == (struct gradedPairs *)NULL) errorGradedSet("No more memory.");
                     69:   g->pairs = (struct pair **)sGC_malloc(sizeof(struct pair *)*(n+1));
                     70:   if (g->pairs == (struct pair **)NULL) errorGradedSet("No more memory.");
                     71:   for (i=0; i<n; i++) {
                     72:     g->pairs[i] = newPair((struct pair *)NULL);
                     73:   }
                     74:   g->lim = n;
                     75:   g->maxGrade = 0;
                     76:   return(g);
                     77: }
                     78:
                     79: struct syz0 *newSyz0() {
                     80:   struct syz0 *r;
                     81:   r = (struct syz0 *)sGC_malloc(sizeof(struct syz0));
                     82:   if (r == (struct syz0 *)NULL) errorGradedSet("newSyz0(): No memory.");
                     83:   r->cf = ZERO; r->syz = ZERO;
                     84:   return(r);
                     85: }
                     86:
                     87: struct pair *pairCopy(node)
                     88: struct pair *node;
                     89: {
                     90:   struct pair *r;
                     91:   r = newPair(node->prev);
                     92:   *r = *node;
                     93:   return(r);
                     94: }
                     95:
                     96: struct gradedPairs *enlargeGradedPairs(size,grD)
                     97: int size;
                     98: struct gradedPairs *grD;
                     99: {
                    100:   struct gradedPairs *new;
                    101:   int i;
                    102:   new = newGradedPairs(size);
                    103:   for (i=0; i<grD->lim; i++) {
                    104:     new->pairs[i] = grD->pairs[i];
                    105:   }
                    106:   return(new);
                    107: }
                    108:
                    109: void insertPair(inode,before)
                    110: struct pair *inode;
                    111: struct pair *before;
                    112: {
                    113:   struct pair *q;
                    114:   inode = pairCopy(inode);
                    115:   if (before == (struct pair *)NULL)
                    116:     errorGradedSet("insertPair(): *before must be a pair.");
                    117:   q = before->next;
                    118:   before->next = inode;
                    119:   inode->prev = before;
                    120:   inode->next = q;
                    121:   if (q != (struct pair *)NULL) {
                    122:     q->prev = inode;
                    123:   }
                    124: }
                    125:
                    126: struct pair *deletePair(p)
                    127: struct pair *p;
                    128: {
                    129:   struct pair *q;
                    130:   struct pair *r;
                    131:   if (p == (struct pair *)NULL)
                    132:     errorGradedSet("deletePair(): *p must be a pair.");
                    133:   if (p->next == (struct pair *)NULL) return((struct pair *)NULL);
                    134:   q = p->next->next;
                    135:   r = p->next;
                    136:   p->next = q;
                    137:   if (q != (struct pair *)NULL) {
                    138:     q->prev = p;
                    139:   }
                    140:   return(r);
                    141: }
                    142:
                    143: struct pair *getPair_org(grD)
                    144: struct gradedPairs *grD;
                    145: {
                    146:   int gmax,i;
                    147:   struct pair *pair;
                    148:   gmax = grD->maxGrade;
                    149:   for (i=0; i<gmax; i++) {
                    150:     if ((grD->pairs[i])->next != (struct pair *)NULL) {
                    151:       pair = deletePair(grD->pairs[i]);
                    152:       return(pair);
                    153:     }
                    154:   }
                    155:   return((struct pair *)NULL);
                    156: }
                    157:
                    158: struct pair *getPair(grD)
                    159: struct gradedPairs *grD;
                    160: {
                    161:   int gmax,i;
                    162:   struct pair *pair;
                    163:   POLY minp;
                    164:   struct pair *node,*minnode;
                    165:   gmax = grD->maxGrade;
                    166:   for (i=0; i<gmax; i++) {
                    167:     if ((grD->pairs[i])->next != (struct pair *)NULL) {
                    168:       node = grD->pairs[i]->next;
                    169:       minp = node->lcm;
                    170:       minnode = node;
                    171:       node = node->next;
                    172:       while (node != (struct pair *)NULL) {
                    173:        if ((*mmLarger)(minp,node->lcm) >= 1) {
                    174:          minnode = node;
                    175:          minp = minnode->lcm;
                    176:        }
                    177:        node = node->next;
                    178:       }
                    179:       pair = deletePair(minnode->prev);
                    180:       return(pair);
                    181:     }
                    182:   }
                    183:   return((struct pair *)NULL);
                    184: }
                    185:
                    186: void whereInG(g,fi,gradep,indexp,sugar)
                    187: struct gradedPolySet *g;
                    188: POLY fi;
                    189: int *gradep;
                    190: int *indexp;
                    191: int sugar;
                    192: {
                    193:   if (sugar) {
                    194:     if (*gradep < 0 ) {
                    195:       /* if sugar and *gradep < 0, then compute the grade.
                    196:         Otherwise, grade is given by the caller. */
                    197:       *gradep = grade_sugar(fi);
                    198:     }
                    199:   }else{
                    200:     *gradep = (*grade)(fi);
                    201:   }
                    202:
                    203:   if (*gradep < 0) {
                    204:     warningGradedSet("whereInG(): the grade is -1.");
                    205:     return;
                    206:   }
                    207:   if (*gradep >= g->maxGrade) {
                    208:     *indexp = 0;
                    209:     return;
                    210:   }
                    211:   *indexp = g->polys[*gradep]->size;
                    212:   return;
                    213: }
                    214:
                    215: struct gradedPolySet *putPolyInG(g,fi,grade,index,syz,mark,serial)
                    216: struct gradedPolySet *g;
                    217: POLY fi;
                    218: int grade;
                    219: int index;
                    220: struct syz0 *syz;
                    221: int mark;
                    222: int serial;
                    223: {
                    224:   int i,j;
                    225:   struct polySet *polysNew;
                    226:   struct gradedPolySet *gnew;
                    227:   struct polySet *ps;
                    228:
                    229:   /*printf("--------------------\n");
                    230:   outputGradedPolySet(g,0);*/
                    231:
                    232:   if (grade < 0) {
                    233:     warningGradedSet("putPolyInG(): the grade is -1. The element is ignored.");
                    234:     return(g);
                    235:   }
                    236:   if (grade >= g->lim) {
                    237:     /* enlarge the gradedPolySet. */
                    238:     if (Debug) printf("Enlarge the gradedPolySet.\n");
                    239:     gnew = newGradedPolySet(grade*2+1);
                    240:     for (i=0; i<g->lim; i++) {
                    241:       gnew->polys[i] = g->polys[i];
                    242:     }
                    243:     for (i=g->lim; i<gnew->lim; i++) {
                    244:       gnew->polys[i] = newPolySet(INITSIZE);
                    245:     }
                    246:     gnew->maxGrade = g->maxGrade;
                    247:     g = gnew;
                    248:   }
                    249:
                    250:   if (g->polys[grade]->lim <= index) {
                    251:     /* enlarge the polySet */
                    252:     if (Debug) printf("Enlarge the polySet.\n");
                    253:     polysNew = newPolySet(index*2+1);
                    254:     for (i=0; i<g->polys[grade]->lim; i++) {
                    255:       polysNew->g[i] = g->polys[grade]->g[i];
                    256:       polysNew->del[i] = g->polys[grade]->del[i];
                    257:       polysNew->syz[i] = g->polys[grade]->syz[i];
                    258:       polysNew->mark[i] = g->polys[grade]->mark[i];
                    259:       polysNew->serial[i] = g->polys[grade]->serial[i];
                    260:     }
                    261:     polysNew->size = g->polys[grade]->size;
                    262:     g->polys[grade] = polysNew;
                    263:   }
                    264:
                    265:   g->polys[grade]->size = index+1;
                    266:   g->polys[grade]->g[index] = fi;
                    267:   g->polys[grade]->del[index] = 0;
                    268:   g->polys[grade]->syz[index] = syz;
                    269:   g->polys[grade]->mark[index] = mark;
                    270:   g->polys[grade]->serial[index] = serial;
                    271:   if (g->maxGrade < grade+1) g->maxGrade = grade+1;
                    272:
                    273:   /*printf("grade=%d, index=%d\n",grade,index);
                    274:   outputGradedPolySet(g,0);*/
                    275:   return(g);
                    276: }
                    277:
                    278: void markRedundant(g,fi,grade,index,sugar)
                    279: struct gradedPolySet *g;
                    280: POLY fi;
                    281: int grade,index;
                    282: int sugar;
                    283: {
                    284:   int i,j;
                    285:   struct polySet *ps;
                    286:   int start;
                    287:
                    288:   /* mark redundant */
                    289:   if (sugar) start=0;else start=grade;
                    290:   for (i=start; i<g->maxGrade; i++) {
                    291:     ps = g->polys[i];
                    292:     for (j=0; j<ps->size; j++) {
                    293:       if (i == grade && j == index) {
                    294:       }else if ((*isReducible)(ps->g[j],fi)) {
                    295:        ps->del[j] = 1;
                    296:       }
                    297:     }
                    298:   }
                    299: }
                    300:
                    301: void markRedundant0(g,grade,index)
                    302: struct gradedPolySet *g;
                    303: int grade,index;
                    304: {
                    305:   int i,j;
                    306:   struct polySet *ps;
                    307:   POLY fi;
                    308:
                    309:   fi = g->polys[grade]->g[index];
                    310:   /* mark redundant */
                    311:   for (i=0; i<g->maxGrade; i++) {
                    312:     ps = g->polys[i];
                    313:     for (j=0; j<ps->size; j++) {
                    314:       if (i == grade && j == index) {
                    315:       }else if ((*isReducible)(ps->g[j],fi)) {
                    316:        ps->del[j] = 1;
                    317:       }else if ((*isReducible)(fi,ps->g[j])) {
                    318:        g->polys[grade]->del[index] = 1;
                    319:        return;
                    320:       }
                    321:     }
                    322:   }
                    323: }
                    324:
                    325: struct gradedPairs *putPairInGradedPairs(struct gradedPairs *grP,
                    326:                                         struct pair *top)
                    327: {
                    328:   if (grP == (struct gradedPairs *)NULL) {
                    329:     grP = newGradedPairs(top->grade +1);
                    330:   }
                    331:   if (grP->lim <= top->grade) {
                    332:     grP = enlargeGradedPairs(2*(top->grade)+1,grP);
                    333:   }
                    334:   insertPair(top,grP->pairs[top->grade]);
                    335:   grP->maxGrade = max(grP->maxGrade,top->grade+1);
                    336:   return(grP);
                    337: }
                    338:
                    339: void errorGradedSet(s)
                    340: char *s;
                    341: {
                    342:   fprintf(stderr,"Error in gradedset.c, red.c, gb.c: %s\n",s);
                    343:   exit(23);
                    344: }
                    345:
                    346: void warningGradedSet(s)
                    347: char *s;
                    348: {
                    349:   fprintf(stderr,"Warning in gradedset.c, red.c, gb.c: %s\n",s);
                    350: }
                    351:
                    352:
                    353: void outputGradedPolySet(grG,needSyz)
                    354: struct gradedPolySet *grG;
                    355: int needSyz;
                    356: {
                    357:   int i,j;
                    358:   struct polySet *set;
                    359:   printf("======== gradedPolySet ==========\n");
                    360:   printf("maxGrade=%d\n",grG->maxGrade);
                    361:   for (i=0; i<grG->maxGrade; i++) {
                    362:     set = grG->polys[i];
                    363:     printf("grade=%d, size=%d\n",i,set->size);
                    364:     for (j=0; j<set->size; j++) {
                    365:       printf("j=%d, del=%d, g=%s\n",j,set->del[j],POLYToString(set->g[j],'*',1));
                    366:       if (needSyz) {
                    367:        printf("mark=%d,serial=%d, syz.cf=%s, syz.syz=%s\n",set->mark[j],
                    368:               set->serial[j],POLYToString(set->syz[j]->cf,'*',1),
                    369:               POLYToString(set->syz[j]->syz,'*',1));
                    370:       }else{
                    371:        printf("mark=%d,serial=%d\n",set->mark[j],
                    372:               set->serial[j]);
                    373:       }
                    374:     }
                    375:   }
                    376:   printf("================================\n\n");
                    377: }
                    378:
                    379: int countGradedPolySet(grG)
                    380: struct gradedPolySet *grG;
                    381: {
                    382:   int i,j;
                    383:   struct polySet *set;
                    384:   int count = 0;
                    385:   for (i=0; i<grG->maxGrade; i++) {
                    386:     set = grG->polys[i];
                    387:     count += set->size;
                    388:   }
                    389:   return(count);
                    390: }
                    391:
                    392:
                    393: void outputGradedPairs(grP)
                    394: struct gradedPairs *grP;
                    395: {
                    396:   int i,j;
                    397:   struct pair *pair;
                    398:   printf("============ gradedPairs ========\n");
                    399:   printf("maxGrade=%d\n",grP->maxGrade);
                    400:   for (i=0; i<grP->maxGrade; i++) {
                    401:     pair = grP->pairs[i]->next;
                    402:     printf("grade=%d\n",i);
                    403:     while (pair != (struct pair *)NULL) {
                    404:       printf("lcm=%s, \n",POLYToString(pair->lcm,'*',1));
                    405:       printf("(grade,index): (%d,%d) and (%d,%d)\n",pair->ig,pair->ii,pair->jg,pair->ji);
                    406:       printf("grade=%d\n",pair->grade);
                    407:       pair = pair->next;
                    408:     }
                    409:   }
                    410:   printf("============================\n\n");
                    411: }
                    412:
                    413: void outputNode(pair)
                    414: struct pair *pair;
                    415: {
                    416:   int i = 0;
                    417:   printf("=== list === \n");
                    418:   while (pair != (struct pair *)NULL) {
                    419:     printf("lcm=%s, \n",POLYToString(pair->lcm,'*',1));
                    420:     printf("(grade,index): (%d,%d) and (%d,%d)\n",pair->ig,pair->ii,pair->jg,pair->ji);
                    421:     printf("grade=%d\n",pair->grade);
                    422:     pair = pair->next;
                    423:     i++;
                    424:     if (i > 100) {
                    425:       printf("Too long list. Type in ret.");
                    426:       getchar(); getchar();
                    427:     }
                    428:   }
                    429:   printf("=========\n");
                    430: }
                    431:
                    432:
                    433: int countPairs(grD)
                    434: struct gradedPairs *grD;
                    435: {
                    436:   int i;
                    437:   int c;
                    438:   struct pair *p;
                    439:   c = 0;
                    440:   for (i=0; i<grD->maxGrade; i++) {
                    441:     p = grD->pairs[i];
                    442:     p = p->next;
                    443:     while (p != (struct pair *)NULL) {
                    444:       c++;
                    445:       p = p->next;
                    446:     }
                    447:   }
                    448:   return(c);
                    449: }
                    450:
                    451: struct gradedPolySet *gradedPolySetCopy(grG)
                    452: struct gradedPolySet *grG;
                    453: {
                    454:   int i,j;
                    455:   struct polySet *ps,*psOld;
                    456:   struct gradedPolySet *newG;
                    457:
                    458:   newG = newGradedPolySet(grG->maxGrade+1);
                    459:   for (i=0; i<grG->maxGrade;i++) {
                    460:     ps = newG->polys[i] = newPolySet((grG->polys[i]->size) +1);
                    461:     psOld = grG->polys[i];
                    462:     for (j=0; j<psOld->size; j++) {
                    463:       ps->g[j] = psOld->g[j];
                    464:       ps->del[j] = psOld->del[j];
                    465:       ps->syz[j] = psOld->syz[j];
                    466:       ps->mark[j] = psOld->mark[j];
                    467:       ps->serial[j] = psOld->serial[j];
                    468:     }
                    469:     ps->size = psOld->size;
                    470:   }
                    471:   newG->maxGrade = grG->maxGrade;
                    472:   return(newG);
                    473: }
                    474:
                    475: int deletePairByCriterion2B(struct gradedPairs *grD,POLY gt,
                    476:                            struct gradedPolySet *grG)
                    477: {
                    478:   int gmax,i;
                    479:   struct pair *node;
                    480:   int count;
                    481:   POLY it;
                    482:   POLY ij;
                    483:   POLY jt;
                    484:   int ig,ii,jg,ji;
                    485:   count = 0;
                    486:   gmax = grD->maxGrade;
                    487:   for (i=0; i<gmax; i++) {
                    488:     if ((grD->pairs[i])->next != (struct pair *)NULL) {
                    489:       node = grD->pairs[i]->next;
                    490:       while (node != (struct pair *)NULL) {
                    491:        ig = node->ig; ii = node->ii;
                    492:        jg = node->jg; ji = node->ji;
                    493:        if ((*isReducible)(node->lcm,gt)) {
                    494:          ig = node->ig; ii = node->ii;
                    495:          jg = node->jg; ji = node->ji;
                    496:          it = (*lcm)(grG->polys[ig]->g[ii],gt);
                    497:          ij = (*lcm)(grG->polys[ig]->g[ii],grG->polys[jg]->g[ji]);
                    498:          jt = (*lcm)(grG->polys[jg]->g[ji],gt);
                    499:          if ((*mmLarger)(it,ij) != 2 &&
                    500:              (*mmLarger)(it,jt) != 2 &&
                    501:              (*mmLarger)(ij,jt) != 2) {
                    502:            node = deletePair(node->prev);
                    503:            count++;
                    504:          }
                    505:        }
                    506:        node = node->next;
                    507:       }
                    508:     }
                    509:   }
                    510:   return(count);
                    511: }

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