=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/gr.c,v retrieving revision 1.53 retrieving revision 1.59 diff -u -p -r1.53 -r1.59 --- OpenXM_contrib2/asir2000/builtin/gr.c 2003/07/18 10:13:12 1.53 +++ OpenXM_contrib2/asir2000/builtin/gr.c 2005/02/17 06:27:35 1.59 @@ -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/gr.c,v 1.52 2003/07/16 05:31:21 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.58 2004/04/22 09:45:24 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -97,7 +97,7 @@ int NoGCD = 0; int GenTrace = 0; int OXCheck = -1; -static int NoSugar = 0; +int NoSugar = 0; static int NoCriB = 0; static int NoGC = 0; static int NoMC = 0; @@ -109,7 +109,7 @@ int Top = 0; int Reverse = 0; static int Max_mag = 0; static int Max_coef = 0; -static char *Demand = 0; +char *Demand = 0; static int PtozpRA = 0; int doing_f4; @@ -298,12 +298,13 @@ void pdl(NODE f) void dp_gr_main(LIST f,LIST v,Num homo,int modular,int field,struct order_spec *ord,LIST *rp) { int i,mindex,m,nochk; - struct order_spec ord1; + struct order_spec *ord1; Q q; VL fv,vv,vc; NODE fd,fd0,fi,fi0,r,r0,t,subst,x,s,xx; NODE ind,ind0; LIST trace,gbindex; + int input_is_dp = 0; mindex = 0; nochk = 0; dp_fcoeffs = field; get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc); @@ -316,14 +317,22 @@ void dp_gr_main(LIST f,LIST v,Num homo,int modular,int homogenize_order(ord,NVars,&ord1); for ( fd0 = fi0 = 0, t = BDY(f); t; t = NEXT(t) ) { NEXTNODE(fd0,fd); NEXTNODE(fi0,fi); - ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fi)); dp_homo((DP)BDY(fi),(DP *)&BDY(fd)); + if ( BDY(t) && OID(BDY(t)) == O_DP ) { + dp_sort((DP)BDY(t),(DP *)&BDY(fi)); input_is_dp = 1; + } else + ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fi)); + dp_homo((DP)BDY(fi),(DP *)&BDY(fd)); } if ( fd0 ) NEXT(fd) = 0; if ( fi0 ) NEXT(fi) = 0; - initd(&ord1); + initd(ord1); } else { for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { - NEXTNODE(fd0,fd); ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd)); + NEXTNODE(fd0,fd); + if ( BDY(t) && OID(BDY(t)) == O_DP ) { + dp_sort((DP)BDY(t),(DP *)&BDY(fd)); input_is_dp = 1; + } else + ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd)); } if ( fd0 ) NEXT(fd) = 0; fi0 = fd0; @@ -340,7 +349,7 @@ void dp_gr_main(LIST f,LIST v,Num homo,int modular,int init_stat(); while ( 1 ) { if ( homo ) { - initd(&ord1); CNVars = NVars+1; + initd(ord1); CNVars = NVars+1; } if ( DP_Print && modular ) { fprintf(asir_out,"mod= %d, eval = ",m); printsubst(subst); @@ -371,7 +380,10 @@ void dp_gr_main(LIST f,LIST v,Num homo,int modular,int } for ( r0 = 0, ind0 = 0; x; x = NEXT(x) ) { NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]); - dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); + if ( input_is_dp ) + BDY(r) = (pointer)ps[(int)BDY(x)]; + else + dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); NEXTNODE(ind0,ind); STOQ((int)BDY(x),q); BDY(ind) = q; } @@ -397,11 +409,12 @@ void dp_gr_main(LIST f,LIST v,Num homo,int modular,int void dp_gr_mod_main(LIST f,LIST v,Num homo,int m,struct order_spec *ord,LIST *rp) { - struct order_spec ord1; + struct order_spec *ord1; VL fv,vv,vc; NODE fd,fd0,r,r0,t,x,s,xx; DP a,b,c; -extern struct oEGT eg_red_mod; + extern struct oEGT eg_red_mod; + int input_is_dp = 0; get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc); NVars = length((NODE)vv); PCoeffs = vc ? 1 : 0; VC = vc; @@ -411,7 +424,11 @@ extern struct oEGT eg_red_mod; initd(ord); if ( homo ) { for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { - ptod(CO,vv,(P)BDY(t),&a); dp_homo(a,&b); + if ( BDY(t) && OID(BDY(t)) == O_DP ) { + dp_sort((DP)BDY(t),&a); input_is_dp = 1; + } else + ptod(CO,vv,(P)BDY(t),&a); + dp_homo(a,&b); if ( PCoeffs ) dp_mod(b,m,0,&c); else @@ -420,10 +437,13 @@ extern struct oEGT eg_red_mod; NEXTNODE(fd0,fd); BDY(fd) = (pointer)c; } } - homogenize_order(ord,NVars,&ord1); initd(&ord1); + homogenize_order(ord,NVars,&ord1); initd(ord1); } else { for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { - ptod(CO,vv,(P)BDY(t),&b); + if ( BDY(t) && OID(BDY(t)) == O_DP ) { + dp_sort((DP)BDY(t),&b); input_is_dp = 1; + } else + ptod(CO,vv,(P)BDY(t),&b); if ( PCoeffs ) dp_mod(b,m,0,&c); else @@ -437,7 +457,7 @@ extern struct oEGT eg_red_mod; setup_arrays(fd0,m,&s); init_stat(); if ( homo ) { - initd(&ord1); CNVars = NVars+1; + initd(ord1); CNVars = NVars+1; } /* init_eg(&eg_red_mod); */ x = gb_mod(s,m); @@ -449,11 +469,19 @@ extern struct oEGT eg_red_mod; reduceall_mod(x,m,&xx); x = xx; if ( PCoeffs ) for ( r0 = 0; x; x = NEXT(x) ) { - NEXTNODE(r0,r); mdtop(CO,m,vv,ps[(int)BDY(x)],(P *)&BDY(r)); + NEXTNODE(r0,r); + if ( input_is_dp ) + mdtodp(ps[(int)BDY(x)],(DP *)&BDY(r)); + else + mdtop(CO,m,vv,ps[(int)BDY(x)],(P *)&BDY(r)); } else for ( r0 = 0; x; x = NEXT(x) ) { - NEXTNODE(r0,r); _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); + NEXTNODE(r0,r); + if ( input_is_dp ) + _mdtodp(ps[(int)BDY(x)],(DP *)&BDY(r)); + else + _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); } print_stat(); if ( r0 ) NEXT(r) = 0; @@ -465,6 +493,7 @@ void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L int homogen; VL fv,vv,vc; NODE fd,fd0,r,r0,t,x,s,xx; + int input_is_dp = 0; dp_fcoeffs = 0; get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc); @@ -474,7 +503,11 @@ void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L error("dp_f4_main : invalid order specification"); initd(ord); for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) { - NEXTNODE(fd0,fd); ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd)); + NEXTNODE(fd0,fd); + if ( BDY(t) && OID(BDY(t)) == O_DP ) { + dp_sort((DP)BDY(t),(DP *)&BDY(fd)); input_is_dp = 1; + } else + ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd)); if ( homogen ) homogen = dp_homogeneous(BDY(fd)); } @@ -486,7 +519,10 @@ void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L } for ( r0 = 0; x; x = NEXT(x) ) { NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]); - dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); + if ( input_is_dp ) + BDY(r) = (pointer)ps[(int)BDY(x)]; + else + dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); } if ( r0 ) NEXT(r) = 0; MKLIST(*rp,r0); @@ -498,6 +534,7 @@ void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s VL fv,vv,vc; DP b,c,c1; NODE fd,fd0,r,r0,t,x,s,xx; + int input_is_dp = 0; dp_fcoeffs = 0; get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc); @@ -507,7 +544,10 @@ void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s error("dp_f4_mod_main : invalid order specification"); initd(ord); for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) { - ptod(CO,vv,(P)BDY(t),&b); + if ( BDY(t) && OID(BDY(t)) == O_DP ) { + dp_sort((DP)BDY(t),&b); input_is_dp = 1; + } else + ptod(CO,vv,(P)BDY(t),&b); if ( homogen ) homogen = dp_homogeneous(b); _dp_mod(b,m,0,&c); @@ -527,7 +567,11 @@ void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s reduceall_mod(x,m,&xx); x = xx; } for ( r0 = 0; x; x = NEXT(x) ) { - NEXTNODE(r0,r); _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); + NEXTNODE(r0,r); + if ( input_is_dp ) + _mdtodp(ps[(int)BDY(x)],(DP *)&BDY(r)); + else + _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r)); } if ( r0 ) NEXT(r) = 0; MKLIST(*rp,r0); @@ -1095,6 +1139,20 @@ void pltovl(LIST l,VL *vl) *vl = r0; } +void vltopl(VL vl,LIST *l) +{ + VL n; + NODE r,r0; + P p; + + n = vl; + for ( r0 = 0; n; n = NEXT(n) ) { + NEXTNODE(r0,r); MKV(n->v,p); BDY(r) = (pointer)p; + } + if ( r0 ) NEXT(r) = 0; + MKLIST(*l,r0); +} + void makesubst(VL v,NODE *s) { NODE r,r0; @@ -1325,9 +1383,10 @@ void reduceall(NODE in,NODE *h) w = (int *)ALLOCA(n*sizeof(int)); for ( i = 0, t = r; i < n; i++, t = NEXT(t) ) w[i] = (int)BDY(t); + /* w[i] < 0 : reduced to 0 */ for ( i = 0; i < n; i++ ) { for ( top = 0, j = n-1; j >= 0; j-- ) - if ( j != i ) { + if ( w[j] >= 0 && j != i ) { MKNODE(t,(pointer)w[j],top); top = t; } get_eg(&tmp0); @@ -1349,10 +1408,16 @@ void reduceall(NODE in,NODE *h) if ( DP_Print || DP_PrintShort ) { fprintf(asir_out,"."); fflush(asir_out); } - w[i] = newps(g1,0,(NODE)0); + if ( g1 ) { + w[i] = newps(g1,0,(NODE)0); + } else { + w[i] = -1; + } } for ( top = 0, j = n-1; j >= 0; j-- ) { - MKNODE(t,(pointer)w[j],top); top = t; + if ( w[j] >= 0 ) { + MKNODE(t,(pointer)w[j],top); top = t; + } } *h = top; if ( DP_Print || DP_PrintShort ) @@ -1378,9 +1443,10 @@ void reduceall_mod(NODE in,int m,NODE *h) w = (int *)ALLOCA(n*sizeof(int)); for ( i = 0, t = r; i < n; i++, t = NEXT(t) ) w[i] = (int)BDY(t); + /* w[i] < 0 : reduced to 0 */ for ( i = 0; i < n; i++ ) { for ( top = 0, j = n-1; j >= 0; j-- ) - if ( j != i ) { + if ( w[j] >= 0 && j != i ) { MKNODE(t,(pointer)w[j],top); top = t; } get_eg(&tmp0); @@ -1394,10 +1460,16 @@ void reduceall_mod(NODE in,int m,NODE *h) if ( DP_Print || DP_PrintShort ) { fprintf(asir_out,"."); fflush(asir_out); } - w[i] = newps_mod(g,m); + if ( g ) { + w[i] = newps_mod(g,m); + } else { + w[i] = -1; + } } for ( top = 0, j = n-1; j >= 0; j-- ) { - MKNODE(t,(pointer)w[j],top); top = t; + if ( w[j] >= 0 ) { + MKNODE(t,(pointer)w[j],top); top = t; + } } *h = top; if ( DP_Print || DP_PrintShort )