=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.208 retrieving revision 1.210 diff -u -p -r1.208 -r1.210 --- OpenXM_contrib2/asir2000/engine/nd.c 2013/09/15 04:30:28 1.208 +++ OpenXM_contrib2/asir2000/engine/nd.c 2013/09/26 00:38:47 1.210 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.207 2013/09/12 06:46:16 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.209 2013/09/25 02:36:24 noro Exp $ */ #include "nd.h" @@ -54,7 +54,8 @@ static NODE nd_tracelist; static NODE nd_alltracelist; static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect; static int *nd_gbblock; -static NODE nd_nzlist; +static NODE nd_nzlist,nd_check_splist; +static int nd_splist; NumberField get_numberfield(); UINT *nd_det_compute_bound(NDV **dm,int n,int j); @@ -1868,6 +1869,29 @@ int do_diagonalize(int sugar,int m) return 1; } +LIST compute_splist() +{ + NODE g,tn0,tn,node; + LIST l0; + ND_pairs d,t; + int i; + Q i1,i2; + + g = 0; d = 0; + for ( i = 0; i < nd_psn; i++ ) { + d = update_pairs(d,g,i,0); + g = update_base(g,i); + } + for ( t = d, tn0 = 0; t; t = NEXT(t) ) { + NEXTNODE(tn0,tn); + STOQ(t->i1,i1); STOQ(t->i2,i2); + node = mknode(2,i1,i2); MKLIST(l0,node); + BDY(tn) = l0; + } + if ( tn0 ) NEXT(tn) = 0; MKLIST(l0,tn0); + return l0; +} + /* return value = 0 => input is not a GB */ NODE nd_gb(int m,int ishomo,int checkonly,int gensyz,int **indp) @@ -1975,6 +1999,45 @@ again: return g; } +/* splist = [[i1,i2],...] */ + +int check_splist(int m,NODE splist) +{ + NODE t,p; + ND_pairs d,r,l; + int stat; + ND h,nf; + + for ( d = 0, t = splist; t; t = NEXT(t) ) { + p = BDY((LIST)BDY(t)); + NEXTND_pairs(d,r); + r->i1 = QTOS((Q)ARG0(p)); r->i2 = QTOS((Q)ARG1(p)); + ndl_lcm(DL(nd_psh[r->i1]),DL(nd_psh[r->i2]),r->lcm); + SG(r) = TD(LCM(r)); /* XXX */ + } + if ( d ) NEXT(r) = 0; + + while ( d ) { +again: + l = nd_minp(d,&d); + stat = nd_sp(m,0,l,&h); + if ( !stat ) { + NEXT(l) = d; d = l; + d = nd_reconstruct(0,d); + goto again; + } + stat = nd_nf(m,0,h,nd_ps,!Top,0,&nf); + if ( !stat ) { + NEXT(l) = d; d = l; + d = nd_reconstruct(0,d); + goto again; + } else if ( nf ) return 0; + if ( DP_Print) { printf("."); fflush(stdout); } + } + if ( DP_Print) { printf("done.\n"); fflush(stdout); } + return 1; +} + int do_diagonalize_trace(int sugar,int m) { int i,nh,stat; @@ -2917,10 +2980,19 @@ void nd_gr(LIST f,LIST v,int m,int homo,int retdp,int ndv_homogenize((NDV)BDY(t),obpe,oadv,oepos,ompos); } - ndv_setup(m,0,fd0,nd_gbblock?1:0,0); + ndv_setup(m,0,fd0,(nd_gbblock||nd_splist)?1:0,0); if ( nd_gentrace ) { MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); } + if ( nd_splist ) { + *rp = compute_splist(); + return; + } + if ( nd_check_splist ) { + if ( check_splist(m,nd_check_splist) ) *rp = (LIST)ONE; + else *rp = 0; + return; + } x = f4?nd_f4(m,&perm):nd_gb(m,ishomo || homo,0,0,&perm); if ( !x ) { *rp = 0; return; @@ -5291,7 +5363,7 @@ Q *nm_ind_pair_to_vect(int mod,UINT *s0,int n,NM_ind_p return r; } -IndArray nm_ind_pair_to_vect_compress(int mod,UINT *s0,int n,NM_ind_pair pair) +IndArray nm_ind_pair_to_vect_compress(int mod,UINT *s0,int n,int *s0hash,NM_ind_pair pair) { NM m; NMV mr; @@ -5300,7 +5372,7 @@ IndArray nm_ind_pair_to_vect_compress(int mod,UINT *s0 unsigned char *ivc; unsigned short *ivs; UINT *v,*ivi,*s0v; - int i,j,len,prev,diff,cdiff; + int i,j,len,prev,diff,cdiff,h; IndArray r; struct oEGT eg0,eg1; @@ -5313,7 +5385,8 @@ struct oEGT eg0,eg1; get_eg(&eg0); for ( i = j = 0, s = s0, mr = BDY(p); j < len; j++, NMV_ADV(mr) ) { ndl_add(d,DL(mr),t); - for ( ; !ndl_equal(t,s); s += nd_wpd, i++ ); + h = ndl_hash_value(t); + for ( ; h != s0hash[i] || !ndl_equal(t,s); s += nd_wpd, i++ ); v[j] = i; } get_eg(&eg1); add_eg(&eg_search,&eg0,&eg1); @@ -5697,7 +5770,6 @@ int nd_symbolic_preproc(PGeoBucket bucket,int trace,UI return col; } - NODE nd_f4(int m,int **indp) { int i,nh,stat,index; @@ -5738,7 +5810,7 @@ NODE nd_f4(int m,int **indp) node = BDY((LIST)BDY(tn)); if ( QTOS((Q)ARG0(node)) == sugar ) break; } - if ( !tn ) error("nd_f4 : inconsistend non-zero list"); + if ( !tn ) error("nd_f4 : inconsistent non-zero list"); for ( t = l, ll0 = 0; t; t = NEXT(t) ) { for ( tn = BDY((LIST)ARG1(node)); tn; tn = NEXT(tn) ) { i1s = QTOS((Q)ARG0(BDY((LIST)BDY(tn)))); @@ -5774,10 +5846,7 @@ NODE nd_f4(int m,int **indp) if ( DP_Print ) fprintf(asir_out,"sugar=%d,symb=%fsec,", sugar,eg_f4.exectime+eg_f4.gctime); - if ( 1 ) - nflist = nd_f4_red(m,l,0,s0vect,col,rp0,nd_gentrace?&ll:0); - else - nflist = nd_f4_red_dist(m,l,s0vect,col,rp0,nd_gentrace?&ll:0); + nflist = nd_f4_red(m,l,0,s0vect,col,rp0,nd_gentrace?&ll:0); /* adding new bases */ for ( r = nflist; r; r = NEXT(r) ) { nf = (NDV)BDY(r); @@ -6028,6 +6097,9 @@ NODE nd_f4_red(int m,ND_pairs sp0,int trace,UINT *s0ve NODE r0,rp; ND_pairs sp; NM_ind_pair *rvect; + UINT *s; + int *s0hash; + init_eg(&eg_search); for ( sp = sp0, nsp = 0; sp; sp = NEXT(sp), nsp++ ); nred = length(rp0); @@ -6037,9 +6109,12 @@ init_eg(&eg_search); /* construction of index arrays */ rvect = (NM_ind_pair *)ALLOCA(nred*sizeof(NM_ind_pair)); + s0hash = (int *)ALLOCA(col*sizeof(int)); + for ( i = 0, s = s0vect; i < col; i++, s += nd_wpd ) + s0hash[i] = ndl_hash_value(s); for ( rp = rp0, i = 0; rp; i++, rp = NEXT(rp) ) { rvect[i] = (NM_ind_pair)BDY(rp); - imat[i] = nm_ind_pair_to_vect_compress(m,s0vect,col,rvect[i]); + imat[i] = nm_ind_pair_to_vect_compress(m,s0vect,col,s0hash,rvect[i]); rhead[imat[i]->head] = 1; } if ( m ) @@ -6364,6 +6439,7 @@ int ox_exec_f4_red(Q proc) return s; } +#if 0 NODE nd_f4_red_dist(int m,ND_pairs sp0,UINT *s0vect,int col,NODE rp0,ND_pairs *nz) { int nsp,nred; @@ -6526,6 +6602,7 @@ void nd_exec_f4_red_dist() } fflush(nd_write); } +#endif int nd_gauss_elim_q(Q **mat0,int *sugar,int row,int col,int *colstat) { @@ -7292,6 +7369,7 @@ void parse_nd_option(NODE opt) nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; nd_gbblock = 0; nd_newelim = 0; nd_intersect = 0; nd_nzlist = 0; + nd_splist = 0; nd_check_splist = 0; for ( t = opt; t; t = NEXT(t) ) { p = BDY((LIST)BDY(t)); key = BDY((STRING)BDY(p)); @@ -7321,6 +7399,10 @@ void parse_nd_option(NODE opt) u = BDY((LIST)value); nd_nzlist = BDY((LIST)ARG2(u)); nd_bpe = QTOS((Q)ARG3(u)); + } else if ( !strcmp(key,"splist") ) + nd_splist = value?1:0; + else if ( !strcmp(key,"check_splist") ) { + nd_check_splist = BDY((LIST)value); } } }