=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/dp-supp.c,v retrieving revision 1.33 retrieving revision 1.35 diff -u -p -r1.33 -r1.35 --- OpenXM_contrib2/asir2000/builtin/dp-supp.c 2004/04/15 08:44:15 1.33 +++ OpenXM_contrib2/asir2000/builtin/dp-supp.c 2004/05/14 06:02:54 1.35 @@ -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/builtin/dp-supp.c,v 1.32 2004/04/15 08:14:13 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.34 2004/04/22 07:52:38 noro Exp $ */ #include "ca.h" #include "base.h" @@ -1568,6 +1568,35 @@ int create_composite_order_spec(VL vl,LIST order,struc if ( 1 ) print_composite_order_spec(spec); } +/* module order spec */ + +void create_modorder_spec(int id,LIST shift,struct modorder_spec **s) +{ + struct modorder_spec *spec; + NODE n,t; + LIST list; + int *ds; + int i,l; + Q q; + + *s = spec = (struct modorder_spec *)MALLOC(sizeof(struct modorder_spec)); + spec->id = id; + if ( shift ) { + n = BDY(shift); + spec->len = l = length(n); + spec->degree_shift = ds = (int *)MALLOC_ATOMIC(l*sizeof(int)); + for ( t = n, i = 0; t; t = NEXT(t), i++ ) + ds[i] = QTOS((Q)BDY(t)); + } else { + spec->len = 0; + spec->degree_shift = 0; + } + STOQ(id,q); + n = mknode(2,q,shift); + MKLIST(list,n); + spec->obj = (Obj)list; +} + /* * converters * @@ -1867,6 +1896,19 @@ void dp_hm(DP p,DP *rp) } } +void dp_ht(DP p,DP *rp) +{ + MP m,mr; + + if ( !p ) + *rp = 0; + else { + m = BDY(p); + NEWMP(mr); mr->dl = m->dl; mr->c = (P)ONE; NEXT(mr) = 0; + MKDP(p->nv,mr,*rp); (*rp)->sugar = mr->dl->td; /* XXX */ + } +} + void dp_rest(DP p,DP *rp) { MP m; @@ -1994,18 +2036,19 @@ LIST extract_initial_term(LIST f,int *weight,int n); DP extract_initial_term_from_dp(DP p,int *weight,int n) { - int w,t,i; + int w,t,i,top; MP m,r0,r; DP dp; if ( !p ) return 0; - w = -1; + top = 1; for ( m = BDY(p); m; m = NEXT(m) ) { for ( i = 0, t = 0; i < n; i++ ) t += weight[i]*m->dl->d[i]; - if ( t > w ) { + if ( top || t > w ) { r0 = 0; w = t; + top = 0; } if ( t == w ) { NEXTMP(r0,r); @@ -2077,16 +2120,18 @@ LIST highest_order(LIST f,int *weight,int n); int highest_order_dp(DP p,int *weight,int n) { - int w,t,i; + int w,t,i,top; MP m; if ( !p ) return -1; - w = -1; + top = 1; for ( m = BDY(p); m; m = NEXT(m) ) { for ( i = 0, t = 0; i < n; i++ ) t += weight[i]*m->dl->d[i]; - if ( t > w ) + if ( top || t > w ) { w = t; + top = 0; + } } return w; } @@ -2146,5 +2191,31 @@ LIST dp_order(LIST f,struct order_spec *ord) } default: error("dp_initial_term : unsupported order"); + } +} + +int dpv_ht(DPV p,DP *h) +{ + int len,max,maxi,i,t; + DP *e; + MP m,mr; + + len = p->len; + e = p->body; + max = -1; + maxi = -1; + for ( i = 0; i < len; i++ ) + if ( e[i] && (t = BDY(e[i])->dl->td) > max ) { + max = t; + maxi = i; + } + if ( max < 0 ) { + *h = 0; + return -1; + } else { + m = BDY(e[maxi]); + NEWMP(mr); mr->dl = m->dl; mr->c = (P)ONE; NEXT(mr) = 0; + MKDP(e[maxi]->nv,mr,*h); (*h)->sugar = mr->dl->td; /* XXX */ + return maxi; } }