=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/gr.c,v retrieving revision 1.38 retrieving revision 1.45 diff -u -p -r1.38 -r1.45 --- OpenXM_contrib2/asir2000/builtin/gr.c 2001/11/16 10:35:07 1.38 +++ OpenXM_contrib2/asir2000/builtin/gr.c 2003/03/14 06:28:48 1.45 @@ -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.37 2001/10/09 01:36:06 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.44 2002/12/27 07:37:57 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -108,6 +108,7 @@ static int Denominator = 1; static int Top = 0; static int Reverse = 0; static int Max_mag = 0; +static int Max_coef = 0; static char *Demand = 0; static int PtozpRA = 0; @@ -338,7 +339,7 @@ void dp_gr_main(LIST f,LIST v,Num homo,int modular,int } print_stat(); if ( ShowMag ) - fprintf(asir_out,"\nMax_mag=%d\n",Max_mag); + fprintf(asir_out,"\nMax_mag=%d, Max_coef=%d\n",Max_mag, Max_coef); } void dp_gr_mod_main(LIST f,LIST v,Num homo,int m,struct order_spec *ord,LIST *rp) @@ -1160,9 +1161,7 @@ void prim_part(DP f,int m,DP *r) else *r = f; } else { - if ( dp_fcoeffs ) - *r = f; - else if ( PCoeffs ) + if ( dp_fcoeffs || PCoeffs ) dp_prim(f,r); else dp_ptozp(f,r); @@ -1537,7 +1536,7 @@ void minsugar(DP_pairs d,DP_pairs *dm,DP_pairs *dr) NODE gb(NODE f,int m,NODE subst) { - int i,nh,prev,mag; + int i,nh,prev,mag,mag0,magt; NODE r,g,gall; DP_pairs d; DP_pairs l; @@ -1551,6 +1550,7 @@ NODE gb(NODE f,int m,NODE subst) static prev_sugar = -1; Max_mag = 0; + Max_coef = 0; prev = 1; doing_f4 = 0; if ( m ) { @@ -1625,8 +1625,12 @@ skip_nf: g = updbase(g,nh); gall = append_one(gall,nh); if ( !dp_fcoeffs && ShowMag ) { - for ( mag = 0, mp = BDY(h); mp; mp = NEXT(mp) ) - mag += p_mag((P)mp->c); + for ( mag = 0, mag0 = 0, mp = BDY(h); mp; mp = NEXT(mp) ) { + magt = p_mag((P)mp->c); + mag0 = MAX(mag0,magt); + mag += magt; + } + Max_coef = MAX(Max_coef,mag0); Max_mag = MAX(Max_mag,mag); } if ( DP_Print ) { @@ -1638,7 +1642,7 @@ skip_nf: l->dp1,l->dp2,length(g),length(gall),DPPlength(d), pss[nh]); if ( ShowMag ) - fprintf(asir_out,",mag=%d",mag); + fprintf(asir_out,",mag=(%d,%d)",mag,mag0); fprintf(asir_out,"\n"); fflush(asir_out); } else if ( DP_PrintShort ) { fprintf(asir_out,"+"); fflush(asir_out); @@ -1779,7 +1783,7 @@ DP_pairs newpairs( NODE /* of index */ g, int t ) p->lcm = lcm_of_DL(CNVars, dl = psh[dp], tdl, (DL)0 ); #if 0 if ( do_weyl ) - p->sugar = dl_weight(p->lcm); + p->sugar = dl_weyl_weight(p->lcm); else #endif p->sugar = (ts > (s = pss[dp] - dl->td) ? ts : s) + p->lcm->td; @@ -1946,7 +1950,8 @@ int dl_redble(DL dl1,DL dl2) return 1; } -int dl_weight(DL dl) +#if 0 +int dl_weyl_weight(DL dl) { int n,w,i; @@ -1955,6 +1960,7 @@ int dl_weight(DL dl) w += (-dl->d[i]+dl->d[n+i]); return w; } +#endif int gbcheck(NODE f) { @@ -1994,27 +2000,27 @@ int gbcheck(NODE f) return 1; } -void gbcheck_list(NODE f,LIST *gp,LIST *pp) +void gbcheck_list(NODE f,int n,VECT *gp,LIST *pp) { int i; NODE r,g,gall,u,u0,t; + VECT vect; LIST pair; DP_pairs d,l; Q q1,q2; - for ( gall = g = 0, d = 0, r = f; r; r = NEXT(r) ) { + /* we need the following settings */ + NVars = CNVars = n; + setup_arrays(f,0,&r); + for ( gall = g = 0, d = 0; r; r = NEXT(r) ) { i = (int)BDY(r); d = updpairs(d,g,i); g = updbase(g,i); gall = append_one(gall,i); } - for ( u0 = 0, t = gall; t; t = NEXT(t) ) { - NEXTNODE(u0,u); - BDY(u) = ps[(int)BDY(t)]; - } - if ( u0 ) - NEXT(u) = 0; - MKLIST(*gp,u); + NEWVECT(vect); vect->len = psn; vect->body = (pointer)ps; + *gp = vect; + for ( u0 = 0, l = d; l; l = NEXT(l) ) { NEXTNODE(u0,u); STOQ(l->dp1,q1); @@ -2025,7 +2031,7 @@ void gbcheck_list(NODE f,LIST *gp,LIST *pp) } if ( u0 ) NEXT(u) = 0; - MKLIST(*pp,u); + MKLIST(*pp,u0); } int membercheck(NODE f,NODE x) @@ -2059,6 +2065,7 @@ void dp_set_flag(Obj name,Obj value) { char *n; int v; + Q ratio; if ( OID(name) != O_STR ) return; @@ -2069,6 +2076,16 @@ void dp_set_flag(Obj name,Obj value) if ( !strcmp(n,"Dist") ) { Dist = (LIST)value; return; } + if ( !strcmp(n,"Content") ) { + ratio = (Q)value; + if ( ratio ) { + DP_Multiple = BD(NM(ratio))[0]; + Denominator = INT(ratio) ? 1 : BD(DN(ratio))[0]; + } else { + DP_Multiple = 0; + Denominator = 1; + } + } if ( value && OID(value) != O_N ) return; v = QTOS((Q)value); @@ -2112,12 +2129,20 @@ void dp_set_flag(Obj name,Obj value) void dp_make_flaglist(LIST *list) { - Q v; + Q v,nm,dn; STRING name,path; NODE n,n1; +#if 0 STOQ(DP_Multiple,v); MKNODE(n,v,0); MKSTR(name,"DP_Multiple"); MKNODE(n1,name,n); n = n1; STOQ(Denominator,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Denominator"); MKNODE(n1,name,n); n = n1; +#else + if ( DP_Multiple ) { + STOQ(DP_Multiple,nm); STOQ(Denominator,dn); divq(nm,dn,&v); + } else + v = 0; + MKNODE(n,v,0); MKSTR(name,"Content"); MKNODE(n1,name,n); n = n1; +#endif MKNODE(n1,Dist,n); n = n1; MKSTR(name,"Dist"); MKNODE(n1,name,n); n = n1; STOQ(Reverse,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Reverse"); MKNODE(n1,name,n); n = n1; STOQ(Stat,v); MKNODE(n1,v,n); n = n1; MKSTR(name,"Stat"); MKNODE(n1,name,n); n = n1; @@ -2170,7 +2195,11 @@ void dp_load(int index,DP *p) sprintf(path,"%s%c%d",Demand,DELIM,index); if ( !(fp = fopen(path,"rb") ) ) error("dp_load : cannot open a file"); - skipvl(fp); loadobj(fp,(Obj *)p); fclose(fp); + if ( PCoeffs ) + loadvl(fp); + else + skipvl(fp); + loadobj(fp,(Obj *)p); fclose(fp); } } @@ -2183,7 +2212,11 @@ int dp_load_t(int index,DP *p) if ( !(fp = fopen(path,"rb") ) ) return 0; else { - skipvl(fp); loadobj(fp,(Obj *)p); fclose(fp); return 1; + if ( PCoeffs ) + loadvl(fp); + else + skipvl(fp); + loadobj(fp,(Obj *)p); fclose(fp); return 1; } }