[BACK]Return to dist.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Annotation of OpenXM_contrib2/asir2000/engine/dist.c, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/engine/dist.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
                      2: #include "ca.h"
                      3:
                      4: #define NV(p) ((p)->nv)
                      5: #define C(p) ((p)->c)
                      6:
                      7: #define ORD_REVGRADLEX 0
                      8: #define ORD_GRADLEX 1
                      9: #define ORD_LEX 2
                     10: #define ORD_BREVGRADLEX 3
                     11: #define ORD_BGRADLEX 4
                     12: #define ORD_BLEX 5
                     13: #define ORD_BREVREV 6
                     14: #define ORD_BGRADREV 7
                     15: #define ORD_BLEXREV 8
                     16: #define ORD_ELIM 9
                     17:
                     18: int (*cmpdl)()=cmpdl_revgradlex;
                     19: int (*primitive_cmpdl[3])() = {cmpdl_revgradlex,cmpdl_gradlex,cmpdl_lex};
                     20:
                     21: int dp_nelim,dp_fcoeffs;
                     22: struct order_spec dp_current_spec;
                     23: int *dp_dl_work;
                     24:
                     25: int has_fcoef(DP);
                     26: int has_fcoef_p(P);
                     27:
                     28: int has_fcoef(f)
                     29: DP f;
                     30: {
                     31:        MP t;
                     32:
                     33:        if ( !f )
                     34:                return 0;
                     35:        for ( t = BDY(f); t; t = NEXT(t) )
                     36:                if ( has_fcoef_p(t->c) )
                     37:                        break;
                     38:        return t ? 1 : 0;
                     39: }
                     40:
                     41: int has_fcoef_p(f)
                     42: P f;
                     43: {
                     44:        DCP dc;
                     45:
                     46:        if ( !f )
                     47:                return 0;
                     48:        else if ( NUM(f) )
                     49:                return (NID((Num)f) == N_LM || NID((Num)f) == N_GF2N) ? 1 : 0;
                     50:        else {
                     51:                for ( dc = DC(f); dc; dc = NEXT(dc) )
                     52:                        if ( has_fcoef_p(COEF(dc)) )
                     53:                                return 1;
                     54:                return 0;
                     55:        }
                     56: }
                     57:
                     58: void initd(spec)
                     59: struct order_spec *spec;
                     60: {
                     61:        switch ( spec->id ) {
                     62:                case 2:
                     63:                        cmpdl = cmpdl_matrix;
                     64:                        dp_dl_work = (int *)MALLOC_ATOMIC(spec->nv*sizeof(int));
                     65:                        break;
                     66:                case 1:
                     67:                        cmpdl = cmpdl_order_pair;
                     68:                        break;
                     69:                default:
                     70:                        switch ( spec->ord.simple ) {
                     71:                                case ORD_REVGRADLEX:
                     72:                                        cmpdl = cmpdl_revgradlex; break;
                     73:                                case ORD_GRADLEX:
                     74:                                        cmpdl = cmpdl_gradlex; break;
                     75:                                case ORD_BREVGRADLEX:
                     76:                                        cmpdl = cmpdl_brevgradlex; break;
                     77:                                case ORD_BGRADLEX:
                     78:                                        cmpdl = cmpdl_bgradlex; break;
                     79:                                case ORD_BLEX:
                     80:                                        cmpdl = cmpdl_blex; break;
                     81:                                case ORD_BREVREV:
                     82:                                        cmpdl = cmpdl_brevrev; break;
                     83:                                case ORD_BGRADREV:
                     84:                                        cmpdl = cmpdl_bgradrev; break;
                     85:                                case ORD_BLEXREV:
                     86:                                        cmpdl = cmpdl_blexrev; break;
                     87:                                case ORD_ELIM:
                     88:                                        cmpdl = cmpdl_elim; break;
                     89:                                case ORD_LEX: default:
                     90:                                        cmpdl = cmpdl_lex; break;
                     91:                        }
                     92:                        break;
                     93:        }
                     94:        dp_current_spec = *spec;
                     95: }
                     96:
                     97: void ptod(vl,dvl,p,pr)
                     98: VL vl,dvl;
                     99: P p;
                    100: DP *pr;
                    101: {
                    102:        int isconst = 0;
                    103:        int n,i;
                    104:        VL tvl;
                    105:        V v;
                    106:        DL d;
                    107:        MP m;
                    108:        DCP dc;
                    109:        DP r,s,t,u;
                    110:        P x,c;
                    111:
                    112:        if ( !p )
                    113:                *pr = 0;
                    114:        else {
                    115:                for ( n = 0, tvl = dvl; tvl; tvl = NEXT(tvl), n++ );
                    116:                if ( NUM(p) ) {
                    117:                        NEWDL(d,n);
                    118:                        NEWMP(m); m->dl = d; C(m) = p; NEXT(m) = 0; MKDP(n,m,*pr); (*pr)->sugar = 0;
                    119:                } else {
                    120:                        for ( i = 0, tvl = dvl, v = VR(p);
                    121:                                tvl && tvl->v != v; tvl = NEXT(tvl), i++ );
                    122:                        if ( !tvl ) {
                    123:                                for ( dc = DC(p), s = 0, MKV(v,x); dc; dc = NEXT(dc) ) {
                    124:                                        ptod(vl,dvl,COEF(dc),&t); pwrp(vl,x,DEG(dc),&c);
                    125:                                        muldc(vl,t,c,&r); addd(vl,r,s,&t); s = t;
                    126:                                }
                    127:                                *pr = s;
                    128:                        } else {
                    129:                                for ( dc = DC(p), s = 0; dc; dc = NEXT(dc) ) {
                    130:                                        ptod(vl,dvl,COEF(dc),&t);
                    131:                                        NEWDL(d,n); d->td = QTOS(DEG(dc)); d->d[i] = d->td;
                    132:                                        NEWMP(m); m->dl = d; C(m) = (P)ONE; NEXT(m) = 0; MKDP(n,m,u); u->sugar = d->td;
                    133:                                        muld(vl,t,u,&r); addd(vl,r,s,&t); s = t;
                    134:                                }
                    135:                                *pr = s;
                    136:                        }
                    137:                }
                    138:        }
                    139:        if ( !dp_fcoeffs && has_fcoef(*pr) )
                    140:                dp_fcoeffs = 1;
                    141: }
                    142:
                    143: void dtop(vl,dvl,p,pr)
                    144: VL vl,dvl;
                    145: DP p;
                    146: P *pr;
                    147: {
                    148:        int n,i;
                    149:        DL d;
                    150:        MP m;
                    151:        P r,s,t,u,w;
                    152:        Q q;
                    153:        VL tvl;
                    154:
                    155:        if ( !p )
                    156:                *pr = 0;
                    157:        else {
                    158:                for ( n = p->nv, m = BDY(p), s = 0; m; m = NEXT(m) ) {
                    159:                        t = C(m);
                    160:                        if ( NUM(t) && NID((Num)t) == N_M ) {
                    161:                                mptop(t,&u); t = u;
                    162:                        }
                    163:                        for ( i = 0, d = m->dl, tvl = dvl;
                    164:                                i < n; tvl = NEXT(tvl), i++ ) {
                    165:                                MKV(tvl->v,r); STOQ(d->d[i],q); pwrp(vl,r,q,&u);
                    166:                                mulp(vl,t,u,&w); t = w;
                    167:                        }
                    168:                        addp(vl,s,t,&u); s = u;
                    169:                }
                    170:                *pr = s;
                    171:        }
                    172: }
                    173:
                    174: void nodetod(node,dp)
                    175: NODE node;
                    176: DP *dp;
                    177: {
                    178:        NODE t;
                    179:        int len,i,td;
                    180:        Q e;
                    181:        DL d;
                    182:        MP m;
                    183:        DP u;
                    184:
                    185:        for ( t = node, len = 0; t; t = NEXT(t), len++ );
                    186:        NEWDL(d,len);
                    187:        for ( t = node, i = 0, td = 0; i < len; t = NEXT(t), i++ ) {
                    188:                e = (Q)BDY(t);
                    189:                if ( !e )
                    190:                        d->d[i] = 0;
                    191:                else if ( !NUM(e) || !RATN(e) || !INT(e) )
                    192:                        error("nodetod : invalid input");
                    193:                else {
                    194:                        d->d[i] = QTOS((Q)e); td += d->d[i];
                    195:                }
                    196:        }
                    197:        d->td = td;
                    198:        NEWMP(m); m->dl = d; C(m) = (P)ONE; NEXT(m) = 0;
                    199:        MKDP(len,m,u); u->sugar = td; *dp = u;
                    200: }
                    201:
                    202: int sugard(m)
                    203: MP m;
                    204: {
                    205:        int s;
                    206:
                    207:        for ( s = 0; m; m = NEXT(m) )
                    208:                s = MAX(s,m->dl->td);
                    209:        return s;
                    210: }
                    211:
                    212: void addd(vl,p1,p2,pr)
                    213: VL vl;
                    214: DP p1,p2,*pr;
                    215: {
                    216:        int n;
                    217:        MP m1,m2,mr,mr0;
                    218:        P t;
                    219:
                    220:        if ( !p1 )
                    221:                *pr = p2;
                    222:        else if ( !p2 )
                    223:                *pr = p1;
                    224:        else {
                    225:                for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; )
                    226:                        switch ( (*cmpdl)(n,m1->dl,m2->dl) ) {
                    227:                                case 0:
                    228:                                        addp(vl,C(m1),C(m2),&t);
                    229:                                        if ( t ) {
                    230:                                                NEXTMP(mr0,mr); mr->dl = m1->dl; C(mr) = t;
                    231:                                        }
                    232:                                        m1 = NEXT(m1); m2 = NEXT(m2); break;
                    233:                                case 1:
                    234:                                        NEXTMP(mr0,mr); mr->dl = m1->dl; C(mr) = C(m1);
                    235:                                        m1 = NEXT(m1); break;
                    236:                                case -1:
                    237:                                        NEXTMP(mr0,mr); mr->dl = m2->dl; C(mr) = C(m2);
                    238:                                        m2 = NEXT(m2); break;
                    239:                        }
                    240:                if ( !mr0 )
                    241:                        if ( m1 )
                    242:                                mr0 = m1;
                    243:                        else if ( m2 )
                    244:                                mr0 = m2;
                    245:                        else {
                    246:                                *pr = 0;
                    247:                                return;
                    248:                        }
                    249:                else if ( m1 )
                    250:                        NEXT(mr) = m1;
                    251:                else if ( m2 )
                    252:                        NEXT(mr) = m2;
                    253:                else
                    254:                        NEXT(mr) = 0;
                    255:                MKDP(NV(p1),mr0,*pr);
                    256:                if ( *pr )
                    257:                        (*pr)->sugar = MAX(p1->sugar,p2->sugar);
                    258:        }
                    259: }
                    260:
                    261: /* for F4 symbolic reduction */
                    262:
                    263: void symb_addd(p1,p2,pr)
                    264: DP p1,p2,*pr;
                    265: {
                    266:        int n;
                    267:        MP m1,m2,mr,mr0;
                    268:        P t;
                    269:
                    270:        if ( !p1 )
                    271:                *pr = p2;
                    272:        else if ( !p2 )
                    273:                *pr = p1;
                    274:        else {
                    275:                for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; ) {
                    276:                        NEXTMP(mr0,mr); C(mr) = (P)ONE;
                    277:                        switch ( (*cmpdl)(n,m1->dl,m2->dl) ) {
                    278:                                case 0:
                    279:                                        mr->dl = m1->dl;
                    280:                                        m1 = NEXT(m1); m2 = NEXT(m2); break;
                    281:                                case 1:
                    282:                                        mr->dl = m1->dl;
                    283:                                        m1 = NEXT(m1); break;
                    284:                                case -1:
                    285:                                        mr->dl = m2->dl;
                    286:                                        m2 = NEXT(m2); break;
                    287:                        }
                    288:                }
                    289:                if ( !mr0 )
                    290:                        if ( m1 )
                    291:                                mr0 = m1;
                    292:                        else if ( m2 )
                    293:                                mr0 = m2;
                    294:                        else {
                    295:                                *pr = 0;
                    296:                                return;
                    297:                        }
                    298:                else if ( m1 )
                    299:                        NEXT(mr) = m1;
                    300:                else if ( m2 )
                    301:                        NEXT(mr) = m2;
                    302:                else
                    303:                        NEXT(mr) = 0;
                    304:                MKDP(NV(p1),mr0,*pr);
                    305:                if ( *pr )
                    306:                        (*pr)->sugar = MAX(p1->sugar,p2->sugar);
                    307:        }
                    308: }
                    309:
                    310: void subd(vl,p1,p2,pr)
                    311: VL vl;
                    312: DP p1,p2,*pr;
                    313: {
                    314:        DP t;
                    315:
                    316:        if ( !p2 )
                    317:                *pr = p1;
                    318:        else {
                    319:                chsgnd(p2,&t); addd(vl,p1,t,pr);
                    320:        }
                    321: }
                    322:
                    323: void chsgnd(p,pr)
                    324: DP p,*pr;
                    325: {
                    326:        MP m,mr,mr0;
                    327:
                    328:        if ( !p )
                    329:                *pr = 0;
                    330:        else {
                    331:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                    332:                        NEXTMP(mr0,mr); chsgnp(C(m),&C(mr)); mr->dl = m->dl;
                    333:                }
                    334:                NEXT(mr) = 0; MKDP(NV(p),mr0,*pr);
                    335:                if ( *pr )
                    336:                        (*pr)->sugar = p->sugar;
                    337:        }
                    338: }
                    339:
                    340: void muld(vl,p1,p2,pr)
                    341: VL vl;
                    342: DP p1,p2,*pr;
                    343: {
                    344:        MP m;
                    345:        DP s,t,u;
                    346:
                    347:        if ( !p1 || !p2 )
                    348:                *pr = 0;
                    349:        else if ( OID(p1) <= O_P )
                    350:                muldc(vl,p2,(P)p1,pr);
                    351:        else if ( OID(p2) <= O_P )
                    352:                muldc(vl,p1,(P)p2,pr);
                    353:        else {
                    354:                for ( m = BDY(p2), s = 0; m; m = NEXT(m) ) {
                    355:                        muldm(vl,p1,m,&t); addd(vl,s,t,&u); s = u;
                    356:                }
                    357:                *pr = s;
                    358:        }
                    359: }
                    360:
                    361: void muldm(vl,p,m0,pr)
                    362: VL vl;
                    363: DP p;
                    364: MP m0;
                    365: DP *pr;
                    366: {
                    367:        MP m,mr,mr0;
                    368:        P c;
                    369:        DL d;
                    370:        int n;
                    371:
                    372:        if ( !p )
                    373:                *pr = 0;
                    374:        else {
                    375:                for ( mr0 = 0, m = BDY(p), c = C(m0), d = m0->dl, n = NV(p);
                    376:                        m; m = NEXT(m) ) {
                    377:                        NEXTMP(mr0,mr);
                    378:                        if ( NUM(C(m)) && RATN(C(m)) && NUM(c) && RATN(c) )
                    379:                                mulq((Q)C(m),(Q)c,(Q *)&C(mr));
                    380:                        else
                    381:                                mulp(vl,C(m),c,&C(mr));
                    382:                        adddl(n,m->dl,d,&mr->dl);
                    383:                }
                    384:                NEXT(mr) = 0; MKDP(NV(p),mr0,*pr);
                    385:                if ( *pr )
                    386:                        (*pr)->sugar = p->sugar + m0->dl->td;
                    387:        }
                    388: }
                    389:
                    390: void muldc(vl,p,c,pr)
                    391: VL vl;
                    392: DP p;
                    393: P c;
                    394: DP *pr;
                    395: {
                    396:        MP m,mr,mr0;
                    397:
                    398:        if ( !p || !c )
                    399:                *pr = 0;
                    400:        else if ( NUM(c) && UNIQ((Q)c) )
                    401:                *pr = p;
                    402:        else if ( NUM(c) && MUNIQ((Q)c) )
                    403:                chsgnd(p,pr);
                    404:        else {
                    405:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                    406:                        NEXTMP(mr0,mr);
                    407:                        if ( NUM(C(m)) && RATN(C(m)) && NUM(c) && RATN(c) )
                    408:                                mulq((Q)C(m),(Q)c,(Q *)&C(mr));
                    409:                        else
                    410:                                mulp(vl,C(m),c,&C(mr));
                    411:                        mr->dl = m->dl;
                    412:                }
                    413:                NEXT(mr) = 0; MKDP(NV(p),mr0,*pr);
                    414:                if ( *pr )
                    415:                        (*pr)->sugar = p->sugar;
                    416:        }
                    417: }
                    418:
                    419: void divsdc(vl,p,c,pr)
                    420: VL vl;
                    421: DP p;
                    422: P c;
                    423: DP *pr;
                    424: {
                    425:        MP m,mr,mr0;
                    426:
                    427:        if ( !c )
                    428:                error("disvsdc : division by 0");
                    429:        else if ( !p )
                    430:                *pr = 0;
                    431:        else {
                    432:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                    433:                        NEXTMP(mr0,mr); divsp(vl,C(m),c,&C(mr)); mr->dl = m->dl;
                    434:                }
                    435:                NEXT(mr) = 0; MKDP(NV(p),mr0,*pr);
                    436:                if ( *pr )
                    437:                        (*pr)->sugar = p->sugar;
                    438:        }
                    439: }
                    440:
                    441: void adddl(n,d1,d2,dr)
                    442: int n;
                    443: DL d1,d2;
                    444: DL *dr;
                    445: {
                    446:        DL dt;
                    447:        int i;
                    448:
                    449:        if ( !d1->td )
                    450:                *dr = d2;
                    451:        else if ( !d2->td )
                    452:                *dr = d1;
                    453:        else {
                    454:                *dr = dt = (DL)MALLOC_ATOMIC((n+1)*sizeof(int));
                    455:                dt->td = d1->td + d2->td;
                    456:                for ( i = 0; i < n; i++ )
                    457:                        dt->d[i] = d1->d[i]+d2->d[i];
                    458:        }
                    459: }
                    460:
                    461: int compd(vl,p1,p2)
                    462: VL vl;
                    463: DP p1,p2;
                    464: {
                    465:        int n,t;
                    466:        MP m1,m2;
                    467:
                    468:        if ( !p1 )
                    469:                return p2 ? -1 : 0;
                    470:        else if ( !p2 )
                    471:                return 1;
                    472:        else {
                    473:                for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2);
                    474:                        m1 && m2; m1 = NEXT(m1), m2 = NEXT(m2) )
                    475:                        if ( (t = (*cmpdl)(n,m1->dl,m2->dl)) ||
                    476:                                (t = compp(vl,C(m1),C(m2)) ) )
                    477:                                return t;
                    478:                if ( m1 )
                    479:                        return 1;
                    480:                else if ( m2 )
                    481:                        return -1;
                    482:                else
                    483:                        return 0;
                    484:        }
                    485: }
                    486:
                    487: int cmpdl_lex(n,d1,d2)
                    488: int n;
                    489: DL d1,d2;
                    490: {
                    491:        int i;
                    492:
                    493:        for ( i = 0; i < n && d1->d[i] == d2->d[i]; i++ );
                    494:        return i == n ? 0 : (d1->d[i] > d2->d[i] ? 1 : -1);
                    495: }
                    496:
                    497: int cmpdl_revlex(n,d1,d2)
                    498: int n;
                    499: DL d1,d2;
                    500: {
                    501:        int i;
                    502:
                    503:        for ( i = n - 1; i >= 0 && d1->d[i] == d2->d[i]; i-- );
                    504:        return i < 0 ? 0 : (d1->d[i] < d2->d[i] ? 1 : -1);
                    505: }
                    506:
                    507: int cmpdl_gradlex(n,d1,d2)
                    508: int n;
                    509: DL d1,d2;
                    510: {
                    511:        if ( d1->td > d2->td )
                    512:                return 1;
                    513:        else if ( d1->td < d2->td )
                    514:                return -1;
                    515:        else
                    516:                return cmpdl_lex(n,d1,d2);
                    517: }
                    518:
                    519: int cmpdl_revgradlex(n,d1,d2)
                    520: int n;
                    521: DL d1,d2;
                    522: {
                    523:        if ( d1->td > d2->td )
                    524:                return 1;
                    525:        else if ( d1->td < d2->td )
                    526:                return -1;
                    527:        else
                    528:                return cmpdl_revlex(n,d1,d2);
                    529: }
                    530:
                    531: int cmpdl_blex(n,d1,d2)
                    532: int n;
                    533: DL d1,d2;
                    534: {
                    535:        int c;
                    536:
                    537:        if ( c = cmpdl_lex(n-1,d1,d2) )
                    538:                return c;
                    539:        else {
                    540:                c = d1->d[n-1] - d2->d[n-1];
                    541:                return c > 0 ? 1 : c < 0 ? -1 : 0;
                    542:        }
                    543: }
                    544:
                    545: int cmpdl_bgradlex(n,d1,d2)
                    546: int n;
                    547: DL d1,d2;
                    548: {
                    549:        int e1,e2,c;
                    550:
                    551:        e1 = d1->td - d1->d[n-1]; e2 = d2->td - d2->d[n-1];
                    552:        if ( e1 > e2 )
                    553:                return 1;
                    554:        else if ( e1 < e2 )
                    555:                return -1;
                    556:        else {
                    557:                c = cmpdl_lex(n-1,d1,d2);
                    558:                if ( c )
                    559:                        return c;
                    560:                else
                    561:                        return d1->td > d2->td ? 1 : d1->td < d2->td ? -1 : 0;
                    562:        }
                    563: }
                    564:
                    565: int cmpdl_brevgradlex(n,d1,d2)
                    566: int n;
                    567: DL d1,d2;
                    568: {
                    569:        int e1,e2,c;
                    570:
                    571:        e1 = d1->td - d1->d[n-1]; e2 = d2->td - d2->d[n-1];
                    572:        if ( e1 > e2 )
                    573:                return 1;
                    574:        else if ( e1 < e2 )
                    575:                return -1;
                    576:        else {
                    577:                c = cmpdl_revlex(n-1,d1,d2);
                    578:                if ( c )
                    579:                        return c;
                    580:                else
                    581:                        return d1->td > d2->td ? 1 : d1->td < d2->td ? -1 : 0;
                    582:        }
                    583: }
                    584:
                    585: int cmpdl_brevrev(n,d1,d2)
                    586: int n;
                    587: DL d1,d2;
                    588: {
                    589:        int e1,e2,f1,f2,c,i;
                    590:
                    591:        for ( i = 0, e1 = 0, e2 = 0; i < dp_nelim; i++ ) {
                    592:                e1 += d1->d[i]; e2 += d2->d[i];
                    593:        }
                    594:        f1 = d1->td - e1; f2 = d2->td - e2;
                    595:        if ( e1 > e2 )
                    596:                return 1;
                    597:        else if ( e1 < e2 )
                    598:                return -1;
                    599:        else {
                    600:                c = cmpdl_revlex(dp_nelim,d1,d2);
                    601:                if ( c )
                    602:                        return c;
                    603:                else if ( f1 > f2 )
                    604:                        return 1;
                    605:                else if ( f1 < f2 )
                    606:                        return -1;
                    607:                else {
                    608:                        for ( i = n - 1; i >= dp_nelim && d1->d[i] == d2->d[i]; i-- );
                    609:                        return i < dp_nelim ? 0 : (d1->d[i] < d2->d[i] ? 1 : -1);
                    610:                }
                    611:        }
                    612: }
                    613:
                    614: int cmpdl_bgradrev(n,d1,d2)
                    615: int n;
                    616: DL d1,d2;
                    617: {
                    618:        int e1,e2,f1,f2,c,i;
                    619:
                    620:        for ( i = 0, e1 = 0, e2 = 0; i < dp_nelim; i++ ) {
                    621:                e1 += d1->d[i]; e2 += d2->d[i];
                    622:        }
                    623:        f1 = d1->td - e1; f2 = d2->td - e2;
                    624:        if ( e1 > e2 )
                    625:                return 1;
                    626:        else if ( e1 < e2 )
                    627:                return -1;
                    628:        else {
                    629:                c = cmpdl_lex(dp_nelim,d1,d2);
                    630:                if ( c )
                    631:                        return c;
                    632:                else if ( f1 > f2 )
                    633:                        return 1;
                    634:                else if ( f1 < f2 )
                    635:                        return -1;
                    636:                else {
                    637:                        for ( i = n - 1; i >= dp_nelim && d1->d[i] == d2->d[i]; i-- );
                    638:                        return i < dp_nelim ? 0 : (d1->d[i] < d2->d[i] ? 1 : -1);
                    639:                }
                    640:        }
                    641: }
                    642:
                    643: int cmpdl_blexrev(n,d1,d2)
                    644: int n;
                    645: DL d1,d2;
                    646: {
                    647:        int e1,e2,f1,f2,c,i;
                    648:
                    649:        for ( i = 0, e1 = 0, e2 = 0; i < dp_nelim; i++ ) {
                    650:                e1 += d1->d[i]; e2 += d2->d[i];
                    651:        }
                    652:        f1 = d1->td - e1; f2 = d2->td - e2;
                    653:        c = cmpdl_lex(dp_nelim,d1,d2);
                    654:        if ( c )
                    655:                return c;
                    656:        else if ( f1 > f2 )
                    657:                return 1;
                    658:        else if ( f1 < f2 )
                    659:                return -1;
                    660:        else {
                    661:                for ( i = n - 1; i >= dp_nelim && d1->d[i] == d2->d[i]; i-- );
                    662:                return i < dp_nelim ? 0 : (d1->d[i] < d2->d[i] ? 1 : -1);
                    663:        }
                    664: }
                    665:
                    666: int cmpdl_elim(n,d1,d2)
                    667: int n;
                    668: DL d1,d2;
                    669: {
                    670:        int e1,e2,i;
                    671:
                    672:        for ( i = 0, e1 = 0, e2 = 0; i < dp_nelim; i++ ) {
                    673:                e1 += d1->d[i]; e2 += d2->d[i];
                    674:        }
                    675:        if ( e1 > e2 )
                    676:                return 1;
                    677:        else if ( e1 < e2 )
                    678:                return -1;
                    679:        else
                    680:                return cmpdl_revgradlex(n,d1,d2);
                    681: }
                    682:
                    683: int cmpdl_order_pair(n,d1,d2)
                    684: int n;
                    685: DL d1,d2;
                    686: {
                    687:        int e1,e2,i,j,l;
                    688:        int *t1,*t2;
                    689:        int len;
                    690:        struct order_pair *pair;
                    691:
                    692:        len = dp_current_spec.ord.block.length;
                    693:        pair = dp_current_spec.ord.block.order_pair;
                    694:
                    695:        for ( i = 0, t1 = d1->d, t2 = d2->d; i < len; i++ ) {
                    696:                l = pair[i].length;
                    697:                switch ( pair[i].order ) {
                    698:                        case 0:
                    699:                                for ( j = 0, e1 = e2 = 0; j < l; j++ ) {
                    700:                                        e1 += t1[j]; e2 += t2[j];
                    701:                                }
                    702:                                if ( e1 > e2 )
                    703:                                        return 1;
                    704:                                else if ( e1 < e2 )
                    705:                                        return -1;
                    706:                                else {
                    707:                                        for ( j = l - 1; j >= 0 && t1[j] == t2[j]; j-- );
                    708:                                        if ( j >= 0 )
                    709:                                                return t1[j] < t2[j] ? 1 : -1;
                    710:                                }
                    711:                                break;
                    712:                        case 1:
                    713:                                for ( j = 0, e1 = e2 = 0; j < l; j++ ) {
                    714:                                        e1 += t1[j]; e2 += t2[j];
                    715:                                }
                    716:                                if ( e1 > e2 )
                    717:                                        return 1;
                    718:                                else if ( e1 < e2 )
                    719:                                        return -1;
                    720:                                else {
                    721:                                        for ( j = 0; j < l && t1[j] == t2[j]; j++ );
                    722:                                        if ( j < l )
                    723:                                                return t1[j] > t2[j] ? 1 : -1;
                    724:                                }
                    725:                                break;
                    726:                        case 2:
                    727:                                for ( j = 0; j < l && t1[j] == t2[j]; j++ );
                    728:                                if ( j < l )
                    729:                                        return t1[j] > t2[j] ? 1 : -1;
                    730:                                break;
                    731:                        default:
                    732:                                error("cmpdl_order_pair : invalid order"); break;
                    733:                }
                    734:                t1 += l; t2 += l;
                    735:        }
                    736:        return 0;
                    737: }
                    738:
                    739: int cmpdl_matrix(n,d1,d2)
                    740: int n;
                    741: DL d1,d2;
                    742: {
                    743:        int *v,*w,*t1,*t2;
                    744:        int s,i,j,len;
                    745:        int **matrix;
                    746:
                    747:        for ( i = 0, t1 = d1->d, t2 = d2->d, w = dp_dl_work; i < n; i++ )
                    748:                w[i] = t1[i]-t2[i];
                    749:        len = dp_current_spec.ord.matrix.row;
                    750:        matrix = dp_current_spec.ord.matrix.matrix;
                    751:        for ( j = 0; j < len; j++ ) {
                    752:                v = matrix[j];
                    753:                for ( i = 0, s = 0; i < n; i++ )
                    754:                        s += v[i]*w[i];
                    755:                if ( s > 0 )
                    756:                        return 1;
                    757:                else if ( s < 0 )
                    758:                        return -1;
                    759:        }
                    760:        return 0;
                    761: }

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