=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.159 retrieving revision 1.163 diff -u -p -r1.159 -r1.163 --- OpenXM_contrib2/asir2000/engine/nd.c 2009/01/05 00:52:20 1.159 +++ OpenXM_contrib2/asir2000/engine/nd.c 2009/01/05 06:29:46 1.163 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.158 2009/01/04 10:02:00 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.162 2009/01/05 02:47:39 noro Exp $ */ #include "nd.h" @@ -46,7 +46,7 @@ static int nd_worb_len; static int nd_found,nd_create,nd_notfirst; static int nmv_adv; static int nd_demand; -static int nd_module,nd_istop,nd_mpos; +static int nd_module,nd_ispot,nd_mpos; NumberField get_numberfield(); UINT *nd_det_compute_bound(NDV **dm,int n,int j); @@ -230,9 +230,9 @@ void ndl_homogenize(UINT *d,UINT *r,int obpe,EPOS oepo } w = TD(d); PUT_EXP(r,nd_nvar-1,weight-w); + if ( nd_module ) MPOS(r) = MPOS(d); TD(r) = weight; if ( nd_blockmask ) ndl_weight_mask(r); - if ( nd_module ) MPOS(r) = MPOS(d); } void ndl_dehomogenize(UINT *d) @@ -364,9 +364,9 @@ void ndl_lcm(UINT *d1,unsigned *d2,UINT *d) d[i] = u; } #endif + if ( nd_module ) MPOS(d) = MPOS(d1); TD(d) = ndl_weight(d); if ( nd_blockmask ) ndl_weight_mask(d); - if ( nd_module ) MPOS(d) = MPOS(d1); } void ndl_max(UINT *d1,unsigned *d2,UINT *d) @@ -399,6 +399,8 @@ int ndl_weight(UINT *d) for ( j = 0; j < nd_epw; j++, u>>=nd_bpe ) t += (u&nd_mask0); } + if ( nd_module && current_module_weight_vector && MPOS(d) ) + t += current_module_weight_vector[MPOS(d)]; return t; } @@ -568,7 +570,7 @@ int ndl_module_grlex_compare(UINT *d1,UINT *d2) { int i; - if ( nd_istop ) { + if ( nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } @@ -577,7 +579,7 @@ int ndl_module_grlex_compare(UINT *d1,UINT *d2) for ( i = nd_nvar-1; i >= 0; i-- ) if ( GET_EXP(d1,i) < GET_EXP(d2,i) ) return 1; else if ( GET_EXP(d1,i) > GET_EXP(d2,i) ) return -1; - if ( !nd_istop ) { + if ( !nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } @@ -588,7 +590,7 @@ int ndl_module_glex_compare(UINT *d1,UINT *d2) { int i; - if ( nd_istop ) { + if ( nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } @@ -597,7 +599,7 @@ int ndl_module_glex_compare(UINT *d1,UINT *d2) for ( i = 0; i < nd_nvar; i++ ) if ( GET_EXP(d1,i) > GET_EXP(d2,i) ) return 1; else if ( GET_EXP(d1,i) < GET_EXP(d2,i) ) return -1; - if ( !nd_istop ) { + if ( !nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } @@ -608,14 +610,14 @@ int ndl_module_lex_compare(UINT *d1,UINT *d2) { int i; - if ( nd_istop ) { + if ( nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } for ( i = 0; i < nd_nvar; i++ ) if ( GET_EXP(d1,i) > GET_EXP(d2,i) ) return 1; else if ( GET_EXP(d1,i) < GET_EXP(d2,i) ) return -1; - if ( !nd_istop ) { + if ( !nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } @@ -626,12 +628,12 @@ int ndl_module_block_compare(UINT *d1,UINT *d2) { int i,c; - if ( nd_istop ) { + if ( nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } if ( c = ndl_block_compare(d1,d2) ) return c; - if ( !nd_istop ) { + if ( !nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } @@ -642,12 +644,12 @@ int ndl_module_matrix_compare(UINT *d1,UINT *d2) { int i,c; - if ( nd_istop ) { + if ( nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } if ( c = ndl_matrix_compare(d1,d2) ) return c; - if ( !nd_istop ) { + if ( !nd_ispot ) { if ( MPOS(d1) < MPOS(d2) ) return 1; else if ( MPOS(d1) > MPOS(d2) ) return -1; } @@ -658,12 +660,12 @@ int ndl_module_composite_compare(UINT *d1,UINT *d2) { int i,c; - if ( nd_istop ) { + if ( nd_ispot ) { if ( MPOS(d1) > MPOS(d2) ) return 1; else if ( MPOS(d1) < MPOS(d2) ) return -1; } if ( c = ndl_composite_compare(d1,d2) ) return c; - if ( !nd_istop ) { + if ( !nd_ispot ) { if ( MPOS(d1) > MPOS(d2) ) return 1; else if ( MPOS(d1) < MPOS(d2) ) return -1; } @@ -725,6 +727,10 @@ INLINE void ndl_add(UINT *d1,UINT *d2,UINT *d) { int i; + if ( nd_module ) { + if ( MPOS(d1) && MPOS(d2) && (MPOS(d1) != MPOS(d2)) ) + error("ndl_add : invalid operation"); + } #if 1 switch ( nd_wpd ) { case 2: @@ -743,11 +749,6 @@ INLINE void ndl_add(UINT *d1,UINT *d2,UINT *d) #else for ( i = 0; i < nd_wpd; i++ ) d[i] = d1[i]+d2[i]; #endif - if ( nd_module ) { - if ( MPOS(d1) && MPOS(d2) && (MPOS(d1) != MPOS(d2)) ) - error("ndl_add : invalid operation"); - MPOS(d) = MPOS(d1); - } } /* d1 += d2 */ @@ -755,6 +756,10 @@ INLINE void ndl_addto(UINT *d1,UINT *d2) { int i; + if ( nd_module ) { + if ( MPOS(d1) && MPOS(d2) && (MPOS(d1) != MPOS(d2)) ) + error("ndl_addto : invalid operation"); + } #if 1 switch ( nd_wpd ) { case 2: @@ -773,11 +778,6 @@ INLINE void ndl_addto(UINT *d1,UINT *d2) #else for ( i = 0; i < nd_wpd; i++ ) d1[i] += d2[i]; #endif - if ( nd_module ) { - if ( MPOS(d1) && MPOS(d2) && (MPOS(d1) != MPOS(d2)) ) - error("ndl_addto : invalid operation"); - MPOS(d1) = MPOS(d2); - } } INLINE void ndl_sub(UINT *d1,UINT *d2,UINT *d) @@ -2209,16 +2209,24 @@ ND_pairs crit_B( ND_pairs d, int s ) lcm = (UINT *)ALLOCA(nd_wpd*sizeof(UINT)); while ( cur ) { tl = cur->lcm; - if ( ndl_reducible(tl,t) - && (ndl_lcm(DL(nd_psh[cur->i1]),t,lcm),!ndl_equal(lcm,tl)) - && (ndl_lcm(DL(nd_psh[cur->i2]),t,lcm),!ndl_equal(lcm,tl)) ) { - remove = cur; - if ( !prev ) { - head = cur = NEXT(cur); - } else { - cur = NEXT(prev) = NEXT(cur); - } - FREENDP(remove); + if ( ndl_reducible(tl,t) ) { + ndl_lcm(DL(nd_psh[cur->i1]),t,lcm); + if ( !ndl_equal(lcm,tl) ) { + ndl_lcm(DL(nd_psh[cur->i2]),t,lcm); + if (!ndl_equal(lcm,tl)) { + remove = cur; + if ( !prev ) { + head = cur = NEXT(cur); + } else { + cur = NEXT(prev) = NEXT(cur); + } + FREENDP(remove); + } else { + prev = cur; cur = NEXT(cur); + } + } else { + prev = cur; cur = NEXT(cur); + } } else { prev = cur; cur = NEXT(cur); } @@ -2637,6 +2645,7 @@ void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe NumberField nf; struct order_spec *ord1; + nd_module = 0; if ( !m && Demand ) nd_demand = 1; else nd_demand = 0; @@ -2823,6 +2832,7 @@ void nd_gr_trace(LIST f,LIST v,int trace,int homo,int struct order_spec *ord1; struct oEGT eg_check,eg0,eg1; + nd_module = 0; if ( DP_Multiple ) nd_scale = ((double)DP_Multiple)/(double)(Denominator?Denominator:1); @@ -3773,6 +3783,7 @@ void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta } if ( nd_module ) { mpos = MPOS(d1); + TD(d1) = ndl_weight(d1); if ( MPOS(d0) ) error("weyl_mul_nm_nmv : invalid operation"); } tab[0] = m; @@ -3809,8 +3820,11 @@ void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta TD(d) = s; PUT_EXP(d,n-1,s-h); } else TD(d) = h; + if ( nd_module ) { + MPOS(d) = mpos; + TD(d) = ndl_weight(d); + } if ( nd_blockmask ) ndl_weight_mask(d); - if ( nd_module ) MPOS(d) = mpos; if ( mod ) c = ctab[j]; else q = ctab_q[j]; p = tab+curlen*j; @@ -4150,9 +4164,12 @@ NDV pltondv(VL vl,VL dvl,LIST p) r = 0; for ( i = 1, t = BDY(p); t; t = NEXT(t), i++ ) { ri = ptond(vl,dvl,(P)BDY(t)); - if ( ri ) - for ( m = BDY(ri); m; m = NEXT(m) ) - MPOS(DL(m)) = i; + if ( ri ) + for ( m = BDY(ri); m; m = NEXT(m) ) { + MPOS(DL(m)) = i; + TD(DL(m)) = ndl_weight(DL(m)); + if ( nd_blockmask ) ndl_weight_mask(DL(m)); + } r = nd_add(0,r,ri); } return ndtondv(0,r); @@ -4453,7 +4470,7 @@ void nd_init_ord(struct order_spec *ord) /* module order */ case 256: - nd_istop = ord->istop; + nd_ispot = ord->ispot; nd_dcomp = -1; nd_isrlex = 0; switch ( ord->ord.simple ) { @@ -6416,9 +6433,9 @@ int nd_monic(int mod,ND *p) PUT_EXP(DL(mr),i+nd_ntrans,e); td += MUL_WEIGHT(e,i+nd_ntrans); } + if ( nd_module ) MPOS(DL(mr)) = MPOS(DL(m)); TD(DL(mr)) = td; if ( nd_blockmask) ndl_weight_mask(DL(mr)); - if ( nd_module ) MPOS(DL(mr)) = MPOS(DL(m)); } } NEXT(mr) = 0;