=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.48 retrieving revision 1.52 diff -u -p -r1.48 -r1.52 --- OpenXM_contrib2/asir2000/engine/nd.c 2003/08/26 01:42:12 1.48 +++ OpenXM_contrib2/asir2000/engine/nd.c 2003/08/27 02:21:16 1.52 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.47 2003/08/25 09:19:43 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.51 2003/08/27 01:53:29 noro Exp $ */ #include "ca.h" #include "inline.h" @@ -218,7 +218,7 @@ int crit_2( int dp1, int dp2 ); /* top level functions */ void nd_gr(LIST f,LIST v,int m,struct order_spec *ord,LIST *rp); -void nd_gr_trace(LIST f,LIST v,int m,int homo,struct order_spec *ord,LIST *rp); +void nd_gr_trace(LIST f,LIST v,int trace,int homo,struct order_spec *ord,LIST *rp); NODE nd_gb(int m,int checkonly); NODE nd_gb_trace(int m); @@ -1512,7 +1512,6 @@ again: } else if ( nf ) { if ( checkonly ) return 0; printf("+"); fflush(stdout); - ndl_print(HDL(nf)); nh = m?nd_newps(m,nf,0):nd_newps(m,0,nf); d = update_pairs(d,g,nh); g = update_base(g,nh); @@ -1619,8 +1618,8 @@ NODE nd_reduceall(int m,NODE f) base.ps = (NDV *)ALLOCA((n-1)*sizeof(NDV)); base.bound = (unsigned int **)ALLOCA((n-1)*sizeof(unsigned int *)); base.len = n-1; - for ( i = 0; i < n; i++ ) { -again: + i = 0; + while ( i < n ) { for ( j = 0; j < i; j++ ) { base.ps[j] = ps[j]; base.bound[j] = bound[j]; } @@ -1629,15 +1628,16 @@ again: } g = ndvtond(m,ps[i]); stat = nd_nf_direct(m,g,&base,1,&nf); - if ( !stat ) { + if ( !stat ) nd_reconstruct_direct(m,ps,n); - goto again; - } else if ( !nf ) { printf("."); fflush(stdout); ndv_free(ps[i]); - for ( j = i+1; j < n; j++ ) ps[j-1] = ps[j]; + for ( j = i+1; j < n; j++ ) { + ps[j-1] = ps[j]; bound[j-1] = bound[j]; + } n--; + base.len = n-1; } else { printf("."); fflush(stdout); ndv_free(ps[i]); @@ -1645,6 +1645,7 @@ again: ps[i] = ndtondv(m,nf); bound[i] = ndv_compute_bound(ps[i]); nd_free(nf); + i++; } } printf("\n"); @@ -2001,6 +2002,7 @@ void nd_gr(LIST f,LIST v,int m,struct order_spec *ord, x = nd_gb(m,0); fprintf(asir_out,"found=%d,notfirst=%d,create=%d\n", nd_found,nd_notfirst,nd_create); + x = nd_reducebase(x); x = nd_reduceall(m,x); for ( r0 = 0, t = x; t; t = NEXT(t) ) { NEXTNODE(r0,r); @@ -2016,16 +2018,27 @@ void nd_gr(LIST f,LIST v,int m,struct order_spec *ord, MKLIST(*rp,r0); } -void nd_gr_trace(LIST f,LIST v,int m,int homo,struct order_spec *ord,LIST *rp) +void nd_gr_trace(LIST f,LIST v,int trace,int homo,struct order_spec *ord,LIST *rp) { struct order_spec ord1; VL fv,vv,vc; NODE fd,fd0,in0,in,r,r0,t,s,cand; + int m,nocheck,nvar,mindex; DP a,b,c,h; P p; get_vars((Obj)f,&fv); pltovl(v,&vv); - nd_nvar = length(vv); + nvar = length(vv); + nocheck = 0; + mindex = 0; + + /* setup modulus */ + if ( trace < 0 ) { + trace = -trace; + nocheck = 1; + } + m = trace > 1 ? trace : get_lprime(mindex); + initd(ord); if ( homo ) { homogenize_order(ord,nd_nvar,&ord1); @@ -2038,9 +2051,6 @@ void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o } if ( fd0 ) NEXT(fd) = 0; if ( in0 ) NEXT(in) = 0; - nd_init_ord(&ord1); - initd(&ord1); - nd_nvar++; } else { for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { ptod(CO,vv,(P)BDY(t),&c); @@ -2050,22 +2060,37 @@ void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o } if ( fd0 ) NEXT(fd) = 0; in0 = fd0; - nd_init_ord(ord); } - do { + while ( 1 ) { + if ( homo ) { + nd_init_ord(&ord1); + initd(&ord1); + nd_nvar = nvar+1; + } else { + nd_init_ord(ord); + nd_nvar = nvar; + } nd_setup(m,1,fd0); cand = nd_gb_trace(m); - if ( !cand ) continue; + if ( !cand ) { + /* failure */ + if ( trace > 1 ) { + *rp = 0; return; + } else + m = get_lprime(++mindex); + continue; + } + if ( homo ) { /* dehomogenization */ for ( t = cand; t; t = NEXT(t) ) ndv_dehomogenize((NDV)BDY(t),ord); - nd_nvar--; + nd_nvar = nvar; initd(ord); nd_init_ord(ord); nd_setup_parameters(); - cand = nd_reducebase(cand); } + cand = nd_reducebase(cand); fprintf(asir_out,"found=%d,notfirst=%d,create=%d\n", nd_found,nd_notfirst,nd_create); cand = nd_reduceall(0,cand); @@ -2076,7 +2101,16 @@ void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o } if ( r0 ) NEXT(r) = 0; cand = r0; - } while ( !nd_check_candidate(in0,cand) ); + if ( nocheck || nd_check_candidate(in0,cand) ) + /* success */ + break; + else if ( trace > 1 ) { + /* failure */ + *rp = 0; return; + } else + /* try the next modulus */ + m = get_lprime(++mindex); + } /* dp->p */ for ( r = cand; r; r = NEXT(r) ) { dtop(CO,vv,BDY(r),&p); @@ -2507,7 +2541,7 @@ unsigned int *ndv_compute_bound(NDV p) int nd_get_exporigin(struct order_spec *ord) { - switch ( nd_ord->id ) { + switch ( ord->id ) { case 0: return 1; case 1: @@ -2515,7 +2549,7 @@ int nd_get_exporigin(struct order_spec *ord) /* d[0]:weight d[1]:w0,...,d[nd_exporigin-1]:w(n-1) */ return ord->ord.block.length+1; case 2: - error("nd_setup_parameters : matrix order is not supported yet."); + error("nd_get_exporigin : matrix order is not supported yet."); } }