=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.133 retrieving revision 1.136 diff -u -p -r1.133 -r1.136 --- OpenXM_contrib2/asir2000/engine/nd.c 2006/06/05 08:11:10 1.133 +++ OpenXM_contrib2/asir2000/engine/nd.c 2006/06/11 06:01:55 1.136 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.132 2006/06/05 01:29:24 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.135 2006/06/06 09:00:38 noro Exp $ */ #include "nd.h" @@ -2083,7 +2083,7 @@ ND_pairs equivalent_pairs( ND_pairs d1, ND_pairs *pres NODE update_base(NODE nd,int ndp) { UINT *dl, *dln; - NODE last, p, head; + NODE last, p, head, cur, prev; dl = DL(nd_psh[ndp]); for ( head = last = 0, p = nd; p; ) { @@ -2096,7 +2096,17 @@ NODE update_base(NODE nd,int ndp) p = NEXT(last = p); } } +#if 1 head = append_one(head,ndp); +#else + for ( prev = 0, cur = head; cur; prev = cur, cur = NEXT(cur) ) + if ( ndv_compare(&(nd_ps[ndp]),&(nd_ps[(int)BDY(cur)]))<0 ) break; + MKNODE(p,(pointer)ndp,cur); + if ( !prev ) + head = p; + else + NEXT(prev) = p; +#endif return head; } @@ -4168,9 +4178,26 @@ IndArray nm_ind_pair_to_vect_compress(int mod,UINT *s0 return r; } +int compress_array(Q *svect,Q *cvect,int n) +{ + int i,j; + + for ( i = j = 0; i < n; i++ ) + if ( svect[i] ) cvect[j++] = svect[i]; + return j; +} + +void expand_array(Q *svect,Q *cvect,int n) +{ + int i,j; + + for ( i = j = 0; j < n; i++ ) + if ( svect[i] ) svect[i] = cvect[j++]; +} + int ndv_reduce_vect_q(Q *svect,int trace,int col,IndArray *imat,NM_ind_pair *rp0,int nred) { - int i,j,k,len,pos,prev; + int i,j,k,len,pos,prev,nz; Q cs,mcs,c1,c2,cr,gcd,t; IndArray ivect; unsigned char *ivc; @@ -4181,11 +4208,13 @@ int ndv_reduce_vect_q(Q *svect,int trace,int col,IndAr NODE rp; int maxrs; double hmag; - struct oVECT v; + Q *cvect; - v.id = O_VECT; v.len = col; v.body = (pointer *)svect; maxrs = 0; - hmag = p_mag((P)svect[0])*nd_scale; + for ( i = 0; i < col && !svect[i]; i++ ); + if ( i == col ) return maxrs; + hmag = p_mag((P)svect[i])*nd_scale; + cvect = (Q *)ALLOCA(col*sizeof(Q)); for ( i = 0; i < nred; i++ ) { ivect = imat[i]; k = ivect->head; @@ -4224,11 +4253,19 @@ int ndv_reduce_vect_q(Q *svect,int trace,int col,IndAr } break; } + for ( j = k+1; j < col && !svect[j]; j++ ); + if ( j == col ) break; + if ( hmag && ((double)p_mag((P)svect[j]) > hmag) ) { + nz = compress_array(svect,cvect,col); + removecont_array(cvect,nz); + expand_array(svect,cvect,nz); + hmag = ((double)p_mag((P)svect[j]))*nd_scale; + } } - if ( hmag && ((double)p_mag((P)svect[0]) > hmag) ) - igcdv(&v,&t); } - igcdv(&v,&t); + nz = compress_array(svect,cvect,col); + removecont_array(cvect,nz); + expand_array(svect,cvect,nz); if ( DP_Print ) { fprintf(asir_out,"-"); fflush(asir_out); } @@ -4847,8 +4884,8 @@ NODE nd_f4_red_q_main(ND_pairs sp0,int nsp,int trace,U SG((NDV)BDY(r)) = spsugar[i]; /* GC_free(spmat[i]); */ } - if ( r0 ) NEXT(r) = 0; + if ( r0 ) NEXT(r) = 0; /* for ( ; i < sprow; i++ ) GC_free(spmat[i]); */ get_eg(&eg2); init_eg(&eg_f4_2); add_eg(&eg_f4_2,&eg1,&eg2); init_eg(&eg_f4); add_eg(&eg_f4,&eg0,&eg2);