=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/dist.c,v retrieving revision 1.40 retrieving revision 1.44 diff -u -p -r1.40 -r1.44 --- OpenXM_contrib2/asir2000/engine/dist.c 2006/04/16 00:51:13 1.40 +++ OpenXM_contrib2/asir2000/engine/dist.c 2011/03/30 02:43:18 1.44 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/engine/dist.c,v 1.39 2005/12/21 23:18:16 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/dist.c,v 1.43 2007/09/17 12:47:45 noro Exp $ */ #include "ca.h" @@ -65,8 +65,10 @@ #define ORD_HOMO_WW_DRL_ZIGZAG 13 int cmpdl_drl_zigzag(), cmpdl_homo_ww_drl_zigzag(); +int cmpdl_top_weight(); int (*cmpdl)()=cmpdl_revgradlex; +int (*cmpdl_tie_breaker)(); int (*primitive_cmpdl[3])() = {cmpdl_revgradlex,cmpdl_gradlex,cmpdl_lex}; int do_weyl; @@ -118,8 +120,13 @@ int has_sfcoef_p(P f) } } +extern N *current_top_weight_vector; +static int current_top_weight_len; + void initd(struct order_spec *spec) { + int len,i; + switch ( spec->id ) { case 3: cmpdl = cmpdl_composite; @@ -165,6 +172,14 @@ void initd(struct order_spec *spec) } break; } + if ( current_top_weight_vector ) { + cmpdl_tie_breaker = cmpdl; + cmpdl = cmpdl_top_weight; + for ( len = 0, i = 0; i < spec->nv; i++ ) + if ( current_top_weight_vector[i] ) + len = MAX(PL(current_top_weight_vector[i]),len); + current_top_weight_len = len; + } dp_current_spec = spec; } @@ -1089,16 +1104,10 @@ void adddl(int n,DL d1,DL d2,DL *dr) DL dt; int i; - if ( !d1->td ) - *dr = d2; - else if ( !d2->td ) - *dr = d1; - else { - *dr = dt = (DL)MALLOC_ATOMIC((n+1)*sizeof(int)); - dt->td = d1->td + d2->td; - for ( i = 0; i < n; i++ ) - dt->d[i] = d1->d[i]+d2->d[i]; - } + *dr = dt = (DL)MALLOC_ATOMIC((n+1)*sizeof(int)); + dt->td = d1->td + d2->td; + for ( i = 0; i < n; i++ ) + dt->d[i] = d1->d[i]+d2->d[i]; } /* d1 += d2 */ @@ -1640,6 +1649,50 @@ int cmpdl_matrix(int n,DL d1,DL d2) return 0; } +int cmpdl_top_weight(int n,DL d1,DL d2) +{ + int *w; + N sum,wm,wma,t; + N *a; + struct oN tn; + int len,i,sgn,tsgn; + int *t1,*t2; + + w = (int *)ALLOCA(n*sizeof(int)); + len = current_top_weight_len+3; + t1 = d1->d; t2 = d2->d; + for ( i = 0; i < n; i++ ) w[i] = t1[i]-t2[i]; + sum = (N)W_ALLOC(len); sgn = 0; + wm = (N)W_ALLOC(len); + wma = (N)W_ALLOC(len); + a = current_top_weight_vector; + for ( i = 0; i < n; i++ ) { + if ( !a[i] || !w[i] ) continue; + tn.p = 1; + if ( w[i] > 0 ) { + tn.b[0] = w[i]; tsgn = 1; + } else { + tn.b[0] = -w[i]; tsgn = -1; + } + _muln(a[i],&tn,wm); + if ( !sgn ) { + sgn = tsgn; + t = wm; wm = sum; sum = t; + } else if ( sgn == tsgn ) { + _addn(sum,wm,wma); + if ( !PL(wma) ) + sgn = 0; + t = wma; wma = sum; sum = t; + } else { + sgn *= _subn(sum,wm,wma); + t = wma; wma = sum; sum = t; + } + } + if ( sgn > 0 ) return 1; + else if ( sgn < 0 ) return -1; + else return (*cmpdl_tie_breaker)(n,d1,d2); +} + GeoBucket create_bucket() { GeoBucket g; @@ -1803,17 +1856,26 @@ int ni_next(int *a,int n) int comp_nbm(NBM a,NBM b) { - int d,i,w; + int d,i,w,ai,bi; int *ab,*bb; if ( a->d > b->d ) return 1; else if ( a->d < b->d ) return -1; else { d = a->d; ab = a->b; bb = b->b; +#if 0 w = (d+31)/32; for ( i = 0; i < w; i++ ) if ( ab[i] > bb[i] ) return 1; else if ( ab[i] < bb[i] ) return -1; +#else + for ( i = 0; i < d; i++ ) { + ai = NBM_GET(ab,i); + bi = NBM_GET(bb,i); + if ( ai > bi ) return 1; + else if ( ai < bi ) return -1; + } +#endif return 0; } } @@ -1876,6 +1938,40 @@ P separate_nbm(NBM a,NBP *a0,NBP *ah,NBP *ar) NEWNBM(t); NEWNBMBDY(t,d1); t->d = d1; t->c = (P)ONE; for ( i = 0; i < d1; i++ ) { if ( NBM_GET(a->b,i+1) ) NBM_SET(t->b,i); + else NBM_CLR(t->b,i); + } + *ar = nbmtonbp(t); + } + + return a->c; +} + +/* a=c*rest*x -> a0= rest*x, ar=rest, at=x */ + +P separate_tail_nbm(NBM a,NBP *a0,NBP *ar,NBP *at) +{ + int i,d,d1; + NBM t; + + if ( !(d=a->d) ) error("separate_tail_nbm : invalid argument"); + + if ( a0 ) { + NEWNBM(t); t->d = a->d; t->b = a->b; t->c = (P)ONE; + *a0 = nbmtonbp(t); + } + + d1 = a->d-1; + if ( at ) { + NEWNBM(t); NEWNBMBDY(t,1); t->d = 1; t->c = (P)ONE; + if ( NBM_GET(a->b,d1) ) NBM_SET(t->b,0); + else NBM_CLR(t->b,0); + *at = nbmtonbp(t); + } + + if ( ar ) { + NEWNBM(t); NEWNBMBDY(t,d1); t->d = d1; t->c = (P)ONE; + for ( i = 0; i < d1; i++ ) { + if ( NBM_GET(a->b,i) ) NBM_SET(t->b,i); else NBM_CLR(t->b,i); } *ar = nbmtonbp(t);