=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.47 retrieving revision 1.51 diff -u -p -r1.47 -r1.51 --- OpenXM_contrib2/asir2000/engine/nd.c 2003/08/25 09:19:43 1.47 +++ OpenXM_contrib2/asir2000/engine/nd.c 2003/08/27 01:53:29 1.51 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.46 2003/08/25 09:16:55 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.50 2003/08/27 01:48:25 noro Exp $ */ #include "ca.h" #include "inline.h" @@ -271,6 +271,7 @@ void nd_reconstruct_direct(int mod,NDV *ps,int len); void nd_setup(int mod,int trace,NODE f); void nd_setup_parameters(); BlockMask nd_create_blockmask(struct order_spec *ord); +int nd_get_exporigin(struct order_spec *ord); /* ND functions */ int nd_check_candidate(NODE input,NODE cand); @@ -1617,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]; } @@ -1627,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]); @@ -1643,6 +1645,7 @@ again: ps[i] = ndtondv(m,nf); bound[i] = ndv_compute_bound(ps[i]); nd_free(nf); + i++; } } printf("\n"); @@ -1999,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); @@ -2062,8 +2066,8 @@ void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o 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); @@ -2347,7 +2351,7 @@ void ndv_dehomogenize(NDV p,struct order_spec *ord) len = p->len; newnvar = nd_nvar-1; - newexporigin = ord->ord.block.length+1; + newexporigin = nd_get_exporigin(ord); newwpd = newnvar/nd_epw+(newnvar%nd_epw?1:0)+newexporigin; for ( m = BDY(p), i = 0; i < len; NMV_ADV(m), i++ ) ndl_dehomogenize(DL(m)); @@ -2503,25 +2507,27 @@ unsigned int *ndv_compute_bound(NDV p) return t; } -void nd_setup_parameters() { - int i,n,elen; - - nd_epw = (sizeof(unsigned int)*8)/nd_bpe; - elen = nd_nvar/nd_epw+(nd_nvar%nd_epw?1:0); - - switch ( nd_ord->id ) { +int nd_get_exporigin(struct order_spec *ord) +{ + switch ( ord->id ) { case 0: - nd_exporigin = 1; - break; + return 1; case 1: /* block order */ /* d[0]:weight d[1]:w0,...,d[nd_exporigin-1]:w(n-1) */ - nd_exporigin = nd_ord->ord.block.length+1; - break; + return ord->ord.block.length+1; case 2: error("nd_setup_parameters : matrix order is not supported yet."); - break; } +} + +void nd_setup_parameters() { + int i,n,elen; + + nd_epw = (sizeof(unsigned int)*8)/nd_bpe; + elen = nd_nvar/nd_epw+(nd_nvar%nd_epw?1:0); + + nd_exporigin = nd_get_exporigin(nd_ord); nd_wpd = nd_exporigin+elen; nd_epos = (EPOS)MALLOC_ATOMIC(nd_nvar*sizeof(struct oEPOS)); for ( i = 0; i < nd_nvar; i++ ) {