Annotation of OpenXM_contrib2/asir2000/engine/dist.c, Revision 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>