| version 1.33, 2004/04/15 08:44:15 | version 1.37, 2004/09/15 06:06:42 | 
|  |  | 
| * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, | * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, | 
| * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. | * 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.36 2004/05/14 09:20:56 noro Exp $ | 
| */ | */ | 
| #include "ca.h" | #include "ca.h" | 
| #include "base.h" | #include "base.h" | 
| 
| Line 62  extern int NoGCD; |  | 
| Line 62  extern int NoGCD; |  | 
| extern int GenTrace; | extern int GenTrace; | 
| extern NODE TraceList; | extern NODE TraceList; | 
|  |  | 
|  | int show_orderspec; | 
|  |  | 
|  | void print_composite_order_spec(struct order_spec *spec); | 
|  |  | 
| /* | /* | 
| * content reduction | * content reduction | 
| * | * | 
| 
| Line 1317  void dp_nf_tab_f(DP p,LIST *tab,DP *rp) |  | 
| Line 1321  void dp_nf_tab_f(DP p,LIST *tab,DP *rp) |  | 
|  |  | 
| int create_order_spec(VL vl,Obj obj,struct order_spec **specp) | int create_order_spec(VL vl,Obj obj,struct order_spec **specp) | 
| { | { | 
| int i,j,n,s,row,col; | int i,j,n,s,row,col,ret; | 
| struct order_spec *spec; | struct order_spec *spec; | 
| struct order_pair *l; | struct order_pair *l; | 
| NODE node,t,tn; | NODE node,t,tn; | 
| 
| Line 1325  int create_order_spec(VL vl,Obj obj,struct order_spec |  | 
| Line 1329  int create_order_spec(VL vl,Obj obj,struct order_spec |  | 
| pointer **b; | pointer **b; | 
| int **w; | int **w; | 
|  |  | 
| if ( vl && obj && OID(obj) == O_LIST ) | if ( vl && obj && OID(obj) == O_LIST ) { | 
| return create_composite_order_spec(vl,(LIST)obj,specp); | ret = create_composite_order_spec(vl,(LIST)obj,specp); | 
|  | if ( show_orderspec ) | 
|  | print_composite_order_spec(*specp); | 
|  | return ret; | 
|  | } | 
|  |  | 
| *specp = spec = (struct order_spec *)MALLOC(sizeof(struct order_spec)); | *specp = spec = (struct order_spec *)MALLOC(sizeof(struct order_spec)); | 
| if ( !obj || NUM(obj) ) { | if ( !obj || NUM(obj) ) { | 
| 
| Line 1406  void print_composite_order_spec(struct order_spec *spe |  | 
| Line 1414  void print_composite_order_spec(struct order_spec *spe |  | 
| } | } | 
| } | } | 
|  |  | 
|  | int comp_sw(struct sparse_weight *a, struct sparse_weight *b) | 
|  | { | 
|  | if ( a->pos > b->pos ) return 1; | 
|  | else if ( a->pos < b->pos ) return -1; | 
|  | else return 0; | 
|  | } | 
|  |  | 
| /* order = [w_or_b, w_or_b, ... ] */ | /* order = [w_or_b, w_or_b, ... ] */ | 
| /* w_or_b = w or b                */ | /* w_or_b = w or b                */ | 
| /* w = [1,2,...] or [x,1,y,2,...] */ | /* w = [1,2,...] or [x,1,y,2,...] */ | 
| 
| Line 1483  int create_composite_order_spec(VL vl,LIST order,struc |  | 
| Line 1498  int create_composite_order_spec(VL vl,LIST order,struc |  | 
| error("a sparse weight vector must be specified as [var1,weight1,...]"); | error("a sparse weight vector must be specified as [var1,weight1,...]"); | 
| sw[j].value = QTOS((Q)BDY(p)); p = NEXT(p); | sw[j].value = QTOS((Q)BDY(p)); p = NEXT(p); | 
| } | } | 
|  | qsort(sw,len,sizeof(struct sparse_weight), | 
|  | (int (*)(const void *,const void *))comp_sw); | 
| w_or_b[i].type = IS_SPARSE_WEIGHT; | w_or_b[i].type = IS_SPARSE_WEIGHT; | 
| w_or_b[i].length = len; | w_or_b[i].length = len; | 
| w_or_b[i].body.sparse_weight = sw; | w_or_b[i].body.sparse_weight = sw; | 
| 
| Line 1565  int create_composite_order_spec(VL vl,LIST order,struc |  | 
| Line 1582  int create_composite_order_spec(VL vl,LIST order,struc |  | 
| w_or_b[n].body.block.order = 0; | w_or_b[n].body.block.order = 0; | 
| spec->ord.composite.length = n+1; | spec->ord.composite.length = n+1; | 
| } | } | 
| 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 | * converters | 
| * | * | 
| 
| Line 1867  void dp_hm(DP p,DP *rp) |  | 
| Line 1912  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) | void dp_rest(DP p,DP *rp) | 
| { | { | 
| MP m; | MP m; | 
| 
| Line 1994  LIST extract_initial_term(LIST f,int *weight,int n); |  | 
| Line 2052  LIST extract_initial_term(LIST f,int *weight,int n); |  | 
|  |  | 
| DP extract_initial_term_from_dp(DP p,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; | MP m,r0,r; | 
| DP dp; | DP dp; | 
|  |  | 
| if ( !p ) return 0; | if ( !p ) return 0; | 
| w = -1; | top = 1; | 
| for ( m = BDY(p); m; m = NEXT(m) ) { | for ( m = BDY(p); m; m = NEXT(m) ) { | 
| for ( i = 0, t = 0; i < n; i++ ) | for ( i = 0, t = 0; i < n; i++ ) | 
| t += weight[i]*m->dl->d[i]; | t += weight[i]*m->dl->d[i]; | 
| if ( t > w ) { | if ( top || t > w ) { | 
| r0 = 0; | r0 = 0; | 
| w = t; | w = t; | 
|  | top = 0; | 
| } | } | 
| if ( t == w ) { | if ( t == w ) { | 
| NEXTMP(r0,r); | NEXTMP(r0,r); | 
| 
| Line 2077  LIST highest_order(LIST f,int *weight,int n); |  | 
| Line 2136  LIST highest_order(LIST f,int *weight,int n); |  | 
|  |  | 
| int highest_order_dp(DP p,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; | MP m; | 
|  |  | 
| if ( !p ) return -1; | if ( !p ) return -1; | 
| w = -1; | top = 1; | 
| for ( m = BDY(p); m; m = NEXT(m) ) { | for ( m = BDY(p); m; m = NEXT(m) ) { | 
| for ( i = 0, t = 0; i < n; i++ ) | for ( i = 0, t = 0; i < n; i++ ) | 
| t += weight[i]*m->dl->d[i]; | t += weight[i]*m->dl->d[i]; | 
| if ( t > w ) | if ( top || t > w ) { | 
| w = t; | w = t; | 
|  | top = 0; | 
|  | } | 
| } | } | 
| return w; | return w; | 
| } | } | 
| 
| Line 2146  LIST dp_order(LIST f,struct order_spec *ord) |  | 
| Line 2207  LIST dp_order(LIST f,struct order_spec *ord) |  | 
| } | } | 
| default: | default: | 
| error("dp_initial_term : unsupported order"); | 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; | 
| } | } | 
| } | } |