=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.192 retrieving revision 1.197 diff -u -p -r1.192 -r1.197 --- OpenXM_contrib2/asir2000/engine/nd.c 2010/12/14 05:29:37 1.192 +++ OpenXM_contrib2/asir2000/engine/nd.c 2011/08/15 09:21:00 1.197 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.191 2010/09/27 05:05:58 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.196 2011/06/16 08:17:15 noro Exp $ */ #include "nd.h" @@ -49,7 +49,7 @@ static int nd_demand; static int nd_module,nd_ispot,nd_mpos,nd_pot_nelim; static NODE nd_tracelist; static NODE nd_alltracelist; -static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim; +static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect; static int *nd_gbblock; NumberField get_numberfield(); @@ -1343,7 +1343,7 @@ int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND node = mknode(4,div,iq,dmul,ONE); } sugar = MAX(sugar,SG(p)+TD(DL(mul))); - if ( !mod && g && ((double)(p_mag(HCP(g))) > hmag) ) { + if ( !mod && g && !nd_vc && ((double)(p_mag(HCP(g))) > hmag) ) { hg = HCU(g); nd_removecont2(d,g); if ( dn || nd_gentrace ) { @@ -1933,7 +1933,7 @@ again: if ( nd_gentrace ) { cont = ndc_div(m,hc,HCU(nf)); if ( m || !UNIQ(cont) ) { - t = mknode(4,0,0,0,cont); + t = mknode(4,NULLP,NULLP,NULLP,cont); MKLIST(list,t); MKNODE(t,list,nd_tracelist); nd_tracelist = t; } @@ -2135,7 +2135,7 @@ again: if ( nd_gentrace ) { cont = ndc_div(0,hnfq,HCU(nfqv)); if ( !UNIQ(cont) ) { - t = mknode(4,0,0,0,cont); + t = mknode(4,NULLP,NULLP,NULLP,cont); MKLIST(list,t); MKNODE(t,list,nd_tracelist); nd_tracelist = t; } @@ -2311,6 +2311,7 @@ ND_pairs nd_newpairs( NODE g, int t ) dl = DL(nd_psh[t]); ts = SG(nd_psh[t]) - TD(dl); + if ( nd_module && nd_intersect && (MPOS(dl) > 1) ) return 0; for ( r0 = 0, h = g; h; h = NEXT(h) ) { if ( nd_module && (MPOS(DL(nd_psh[(long)BDY(h)])) != MPOS(dl)) ) continue; @@ -2823,7 +2824,7 @@ void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct Q jq; int *perm; EPOS oepos; - int obpe,oadv,ompos; + int obpe,oadv,ompos,cbpe; nd_module = 0; if ( !m && Demand ) nd_demand = 1; @@ -2925,23 +2926,35 @@ void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct nd_setup_parameters(nvar,0); } nd_demand = 0; + if ( nd_module && nd_intersect ) { + for ( j = nd_psn-1, x = 0; j >= 0; j-- ) + if ( MPOS(DL(nd_psh[j])) > 1 ) { + MKNODE(xx,(pointer)j,x); x = xx; + } + conv_ilist(nd_demand,0,x,0); + goto FINAL; + } x = ndv_reducebase(x,perm); if ( nd_gentrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; } x = ndv_reduceall(m,x); + cbpe = nd_bpe; if ( nd_gentrace ) { tl2 = nd_alltracelist; nd_alltracelist = 0; ndv_check_membership(m,fd0,obpe,oadv,oepos,x); if ( nd_gentrace ) { tl3 = nd_alltracelist; nd_alltracelist = 0; } else tl3 = 0; - nd_gb(m,0,1,nd_gensyz?1:0,0)!=0; + nd_gb(m,0,1,nd_gensyz?1:0,0); if ( nd_gentrace && nd_gensyz ) { tl4 = nd_alltracelist; nd_alltracelist = 0; } else tl4 = 0; } + nd_bpe = cbpe; + nd_setup_parameters(nd_nvar,0); +FINAL: for ( r0 = 0, t = x; t; t = NEXT(t) ) { NEXTNODE(r0,r); - if ( nd_module ) BDY(r) = ndvtopl(m,CO,vv,BDY(t),mrank); + if ( nd_module ) BDY(r) = ndvtopl(m,CO,vv,BDY(t),mrank); else BDY(r) = ndvtop(m,CO,vv,BDY(t)); } if ( r0 ) NEXT(r) = 0; @@ -2989,6 +3002,7 @@ void nd_gr_postproc(LIST f,LIST v,int m,struct order_s struct order_spec *ord1; int *perm; + parse_nd_option(current_option); get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&nd_vc); for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); switch ( ord->id ) { @@ -6920,7 +6934,7 @@ void finalize_tracelist(int i,P cont) Q iq; if ( !UNIQ(cont) ) { - node = mknode(4,0,0,0,cont); + node = mknode(4,NULLP,NULLP,NULLP,cont); MKLIST(l,node); MKNODE(node,l,nd_tracelist); nd_tracelist = node; } @@ -6955,7 +6969,7 @@ void parse_nd_option(NODE opt) Obj value; nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; nd_gbblock = 0; - nd_newelim = 0; + nd_newelim = 0; nd_intersect = 0; for ( t = opt; t; t = NEXT(t) ) { p = BDY((LIST)BDY(t)); key = BDY((STRING)BDY(p)); @@ -6979,5 +6993,7 @@ void parse_nd_option(NODE opt) nd_gbblock[i] = -1; } else if ( !strcmp(key,"newelim") ) nd_newelim = value?1:0; + else if ( !strcmp(key,"intersect") ) + nd_intersect = value?1:0; } }