version 1.187, 2010/04/26 01:06:22 |
version 1.197, 2011/08/15 09:21:00 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.186 2010/04/23 07:35:44 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.196 2011/06/16 08:17:15 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 49 static int nd_demand; |
|
Line 49 static int nd_demand; |
|
static int nd_module,nd_ispot,nd_mpos,nd_pot_nelim; |
static int nd_module,nd_ispot,nd_mpos,nd_pot_nelim; |
static NODE nd_tracelist; |
static NODE nd_tracelist; |
static NODE nd_alltracelist; |
static NODE nd_alltracelist; |
static int nd_gentrace,nd_gensyz,nd_nora; |
static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect; |
static int *nd_gbblock; |
static int *nd_gbblock; |
|
|
NumberField get_numberfield(); |
NumberField get_numberfield(); |
Line 1343 int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND |
|
Line 1343 int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND |
|
node = mknode(4,div,iq,dmul,ONE); |
node = mknode(4,div,iq,dmul,ONE); |
} |
} |
sugar = MAX(sugar,SG(p)+TD(DL(mul))); |
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); |
hg = HCU(g); |
nd_removecont2(d,g); |
nd_removecont2(d,g); |
if ( dn || nd_gentrace ) { |
if ( dn || nd_gentrace ) { |
|
|
goto again; |
goto again; |
} else if ( nf ) { |
} else if ( nf ) { |
if ( checkonly || gensyz ) return 0; |
if ( checkonly || gensyz ) return 0; |
|
if ( nd_newelim ) { |
|
if ( nd_module ) { |
|
if ( MPOS(HDL(nf)) > 1 ) return 0; |
|
} else if ( !(HDL(nf)[nd_exporigin] & nd_mask[0]) ) return 0; |
|
} |
if ( DP_Print ) { printf("+"); fflush(stdout); } |
if ( DP_Print ) { printf("+"); fflush(stdout); } |
hc = HCU(nf); |
hc = HCU(nf); |
nd_removecont(m,nf); |
nd_removecont(m,nf); |
|
|
if ( nd_gentrace ) { |
if ( nd_gentrace ) { |
cont = ndc_div(m,hc,HCU(nf)); |
cont = ndc_div(m,hc,HCU(nf)); |
if ( m || !UNIQ(cont) ) { |
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); |
MKLIST(list,t); MKNODE(t,list,nd_tracelist); |
nd_tracelist = t; |
nd_tracelist = t; |
} |
} |
|
|
if ( nd_gentrace ) { |
if ( nd_gentrace ) { |
cont = ndc_div(0,hnfq,HCU(nfqv)); |
cont = ndc_div(0,hnfq,HCU(nfqv)); |
if ( !UNIQ(cont) ) { |
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); |
MKLIST(list,t); MKNODE(t,list,nd_tracelist); |
nd_tracelist = t; |
nd_tracelist = t; |
} |
} |
Line 2306 ND_pairs nd_newpairs( NODE g, int t ) |
|
Line 2311 ND_pairs nd_newpairs( NODE g, int t ) |
|
|
|
dl = DL(nd_psh[t]); |
dl = DL(nd_psh[t]); |
ts = SG(nd_psh[t]) - TD(dl); |
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) ) { |
for ( r0 = 0, h = g; h; h = NEXT(h) ) { |
if ( nd_module && (MPOS(DL(nd_psh[(long)BDY(h)])) != MPOS(dl)) ) |
if ( nd_module && (MPOS(DL(nd_psh[(long)BDY(h)])) != MPOS(dl)) ) |
continue; |
continue; |
Line 2316 ND_pairs nd_newpairs( NODE g, int t ) |
|
Line 2322 ND_pairs nd_newpairs( NODE g, int t ) |
|
if ( t0 >= min && t0 <= max && t >= min && t <= max ) |
if ( t0 >= min && t0 <= max && t >= min && t <= max ) |
break; |
break; |
} |
} |
if ( nd_gbblock[i] >= 0 ) { |
if ( nd_gbblock[i] >= 0 ) |
fprintf(stderr,"(%d,%d)",t0,t); |
|
continue; |
continue; |
} |
|
} |
} |
NEXTND_pairs(r0,r); |
NEXTND_pairs(r0,r); |
r->i1 = (long)BDY(h); |
r->i1 = (long)BDY(h); |
Line 2820 void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct |
|
Line 2824 void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct |
|
Q jq; |
Q jq; |
int *perm; |
int *perm; |
EPOS oepos; |
EPOS oepos; |
int obpe,oadv,ompos; |
int obpe,oadv,ompos,cbpe; |
|
|
nd_module = 0; |
nd_module = 0; |
if ( !m && Demand ) nd_demand = 1; |
if ( !m && Demand ) nd_demand = 1; |
Line 2912 void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct |
|
Line 2916 void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct |
|
MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); |
MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); |
} |
} |
x = f4?nd_f4(m,&perm):nd_gb(m,ishomo || homo,0,0,&perm); |
x = f4?nd_f4(m,&perm):nd_gb(m,ishomo || homo,0,0,&perm); |
|
if ( !x ) { |
|
*rp = 0; return; |
|
} |
if ( !ishomo && homo ) { |
if ( !ishomo && homo ) { |
/* dehomogenization */ |
/* dehomogenization */ |
for ( t = x; t; t = NEXT(t) ) ndv_dehomogenize((NDV)BDY(t),ord); |
for ( t = x; t; t = NEXT(t) ) ndv_dehomogenize((NDV)BDY(t),ord); |
Line 2919 void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct |
|
Line 2926 void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct |
|
nd_setup_parameters(nvar,0); |
nd_setup_parameters(nvar,0); |
} |
} |
nd_demand = 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); |
x = ndv_reducebase(x,perm); |
if ( nd_gentrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; } |
if ( nd_gentrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; } |
x = ndv_reduceall(m,x); |
x = ndv_reduceall(m,x); |
|
cbpe = nd_bpe; |
if ( nd_gentrace ) { |
if ( nd_gentrace ) { |
tl2 = nd_alltracelist; nd_alltracelist = 0; |
tl2 = nd_alltracelist; nd_alltracelist = 0; |
ndv_check_membership(m,fd0,obpe,oadv,oepos,x); |
ndv_check_membership(m,fd0,obpe,oadv,oepos,x); |
if ( nd_gentrace ) { |
if ( nd_gentrace ) { |
tl3 = nd_alltracelist; nd_alltracelist = 0; |
tl3 = nd_alltracelist; nd_alltracelist = 0; |
} else tl3 = 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 ) { |
if ( nd_gentrace && nd_gensyz ) { |
tl4 = nd_alltracelist; nd_alltracelist = 0; |
tl4 = nd_alltracelist; nd_alltracelist = 0; |
} else tl4 = 0; |
} else tl4 = 0; |
} |
} |
|
nd_bpe = cbpe; |
|
nd_setup_parameters(nd_nvar,0); |
|
FINAL: |
for ( r0 = 0, t = x; t; t = NEXT(t) ) { |
for ( r0 = 0, t = x; t; t = NEXT(t) ) { |
NEXTNODE(r0,r); |
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)); |
else BDY(r) = ndvtop(m,CO,vv,BDY(t)); |
} |
} |
if ( r0 ) NEXT(r) = 0; |
if ( r0 ) NEXT(r) = 0; |
Line 2983 void nd_gr_postproc(LIST f,LIST v,int m,struct order_s |
|
Line 3002 void nd_gr_postproc(LIST f,LIST v,int m,struct order_s |
|
struct order_spec *ord1; |
struct order_spec *ord1; |
int *perm; |
int *perm; |
|
|
|
parse_nd_option(current_option); |
get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&nd_vc); |
get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&nd_vc); |
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
switch ( ord->id ) { |
switch ( ord->id ) { |
Line 4930 EPOS nd_create_epos(struct order_spec *ord) |
|
Line 4950 EPOS nd_create_epos(struct order_spec *ord) |
|
|
|
/* external interface */ |
/* external interface */ |
|
|
void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec *ord,P *rp) |
void nd_nf_p(Obj f,LIST g,LIST v,int m,struct order_spec *ord,Obj *rp) |
{ |
{ |
NODE t,in0,in; |
NODE t,in0,in; |
ND nd,nf; |
ND ndf,nf; |
NDV ndv; |
NDV ndvf; |
VL vv,tv; |
VL vv,tv; |
int stat,nvar,max,e; |
int stat,nvar,max,mrank; |
union oNDC dn; |
union oNDC dn; |
Q cont; |
Q cont; |
P pp; |
P pp; |
|
LIST ppl; |
|
|
if ( !f ) { |
if ( !f ) { |
*rp = 0; |
*rp = 0; |
Line 4948 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
Line 4969 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
pltovl(v,&vv); |
pltovl(v,&vv); |
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
|
|
/* get the degree bound */ |
/* max=65536 implies nd_bpe=32 */ |
for ( t = BDY(g), max = 1; t; t = NEXT(t) ) |
max = 65536; |
for ( tv = vv; tv; tv = NEXT(tv) ) { |
|
e = getdeg(tv->v,(P)BDY(t)); |
|
max = MAX(e,max); |
|
} |
|
for ( tv = vv; tv; tv = NEXT(tv) ) { |
|
e = getdeg(tv->v,f); |
|
max = MAX(e,max); |
|
} |
|
|
|
|
nd_module = 0; |
|
/* nd_module will be set if ord is a module ordering */ |
nd_init_ord(ord); |
nd_init_ord(ord); |
nd_setup_parameters(nvar,max); |
nd_setup_parameters(nvar,max); |
|
if ( nd_module && OID(f) != O_LIST ) |
|
error("nd_nf_p : the first argument must be a list"); |
|
if ( nd_module ) mrank = length(BDY((LIST)f)); |
/* conversion to ndv */ |
/* conversion to ndv */ |
for ( in0 = 0, t = BDY(g); t; t = NEXT(t) ) { |
for ( in0 = 0, t = BDY(g); t; t = NEXT(t) ) { |
NEXTNODE(in0,in); |
NEXTNODE(in0,in); |
ptozp((P)BDY(t),1,&cont,&pp); |
if ( nd_module ) { |
BDY(in) = (pointer)ptondv(CO,vv,pp); |
if ( !BDY(t) || OID(BDY(t)) != O_LIST |
|
|| length(BDY((LIST)BDY(t))) != mrank ) |
|
error("nd_nf_p : inconsistent basis element"); |
|
if ( !m ) pltozpl((LIST)BDY(t),&cont,&ppl); |
|
else ppl = (LIST)BDY(t); |
|
BDY(in) = (pointer)pltondv(CO,vv,ppl); |
|
} else { |
|
if ( !m ) ptozp((P)BDY(t),1,&cont,&pp); |
|
else pp = (P)BDY(t); |
|
BDY(in) = (pointer)ptondv(CO,vv,pp); |
|
} |
if ( m ) ndv_mod(m,(NDV)BDY(in)); |
if ( m ) ndv_mod(m,(NDV)BDY(in)); |
} |
} |
NEXTNODE(in0,in); |
if ( in0 ) NEXT(in) = 0; |
BDY(in) = (pointer)ptondv(CO,vv,f); |
|
if ( m ) ndv_mod(m,(NDV)BDY(in)); |
|
NEXT(in) = 0; |
|
|
|
|
if ( nd_module ) ndvf = pltondv(CO,vv,(LIST)f); |
|
else ndvf = ptondv(CO,vv,(P)f); |
|
if ( m ) ndv_mod(m,ndvf); |
|
ndf = (pointer)ndvtond(m,ndvf); |
|
|
/* dont sort, dont removecont */ |
/* dont sort, dont removecont */ |
ndv_setup(m,0,in0,1,1); |
ndv_setup(m,0,in0,1,1); |
nd_psn--; |
|
nd_scale=2; |
nd_scale=2; |
while ( 1 ) { |
stat = nd_nf(m,0,ndf,nd_ps,1,0,&nf); |
nd = (pointer)ndvtond(m,nd_ps[nd_psn]); |
if ( !stat ) |
stat = nd_nf(m,0,nd,nd_ps,1,0,&nf); |
error("nd_nf_p : exponent too large"); |
if ( !stat ) { |
if ( nd_module ) *rp = (Obj)ndvtopl(m,CO,vv,ndtondv(m,nf),mrank); |
nd_psn++; |
else *rp = (Obj)ndvtop(m,CO,vv,ndtondv(m,nf)); |
nd_reconstruct(0,0); |
|
nd_psn--; |
|
} else |
|
break; |
|
} |
|
*rp = ndvtop(m,CO,vv,ndtondv(m,nf)); |
|
} |
} |
|
|
int nd_to_vect(int mod,UINT *s0,int n,ND d,UINT *r) |
int nd_to_vect(int mod,UINT *s0,int n,ND d,UINT *r) |
Line 6602 void nd_det(int mod,MAT f,P *rp) |
|
Line 6624 void nd_det(int mod,MAT f,P *rp) |
|
bucket = create_pbucket(); |
bucket = create_pbucket(); |
if ( mi[k] ) { |
if ( mi[k] ) { |
nmv = BDY(mjj); len = LEN(mjj); |
nmv = BDY(mjj); len = LEN(mjj); |
fprintf(stderr,"len=%d\n",len); |
|
for ( a = 0; a < len; a++, NMV_ADV(nmv) ) { |
for ( a = 0; a < len; a++, NMV_ADV(nmv) ) { |
fprintf(stderr,"."); |
|
u = ndv_mul_nmv_trunc(mod,nmv,mi[k],DL(BDY(d))); |
u = ndv_mul_nmv_trunc(mod,nmv,mi[k],DL(BDY(d))); |
add_pbucket(mod,bucket,u); |
add_pbucket(mod,bucket,u); |
if ( !(a%1000) ) |
|
fprintf(stderr,"%d\n",a); |
|
} |
} |
} |
} |
if ( mj[k] && mij ) { |
if ( mj[k] && mij ) { |
nmv = BDY(mij); len = LEN(mij); |
nmv = BDY(mij); len = LEN(mij); |
fprintf(stderr,"len=%d\n",len); |
|
for ( a = 0; a < len; a++, NMV_ADV(nmv) ) { |
for ( a = 0; a < len; a++, NMV_ADV(nmv) ) { |
fprintf(stderr,"."); |
|
u = ndv_mul_nmv_trunc(mod,nmv,mj[k],DL(BDY(d))); |
u = ndv_mul_nmv_trunc(mod,nmv,mj[k],DL(BDY(d))); |
add_pbucket(mod,bucket,u); |
add_pbucket(mod,bucket,u); |
if ( !(a%1000) ) |
|
fprintf(stderr,"%d\n",a); |
|
} |
} |
} |
} |
u = nd_quo(mod,bucket,d); |
u = nd_quo(mod,bucket,d); |
Line 6920 void finalize_tracelist(int i,P cont) |
|
Line 6934 void finalize_tracelist(int i,P cont) |
|
Q iq; |
Q iq; |
|
|
if ( !UNIQ(cont) ) { |
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); |
MKLIST(l,node); MKNODE(node,l,nd_tracelist); |
nd_tracelist = node; |
nd_tracelist = node; |
} |
} |
Line 6955 void parse_nd_option(NODE opt) |
|
Line 6969 void parse_nd_option(NODE opt) |
|
Obj value; |
Obj value; |
|
|
nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; nd_gbblock = 0; |
nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; nd_gbblock = 0; |
|
nd_newelim = 0; nd_intersect = 0; |
for ( t = opt; t; t = NEXT(t) ) { |
for ( t = opt; t; t = NEXT(t) ) { |
p = BDY((LIST)BDY(t)); |
p = BDY((LIST)BDY(t)); |
key = BDY((STRING)BDY(p)); |
key = BDY((STRING)BDY(p)); |
Line 6969 void parse_nd_option(NODE opt) |
|
Line 6984 void parse_nd_option(NODE opt) |
|
if ( !value || OID(value) != O_LIST ) |
if ( !value || OID(value) != O_LIST ) |
error("nd_* : invalid value for gbblock option"); |
error("nd_* : invalid value for gbblock option"); |
u = BDY((LIST)value); |
u = BDY((LIST)value); |
nd_gbblock = MALLOC(2*length(t)+1); |
nd_gbblock = MALLOC((2*length(u)+1)*sizeof(int)); |
for ( i = 0; u; u = NEXT(u) ) { |
for ( i = 0; u; u = NEXT(u) ) { |
p = BDY((LIST)BDY(u)); |
p = BDY((LIST)BDY(u)); |
s = nd_gbblock[i++] = QTOS((Q)BDY(p)); |
s = nd_gbblock[i++] = QTOS((Q)BDY(p)); |
nd_gbblock[i++] = s+QTOS((Q)BDY(NEXT(p)))-1; |
nd_gbblock[i++] = s+QTOS((Q)BDY(NEXT(p)))-1; |
} |
} |
nd_gbblock[i] = -1; |
nd_gbblock[i] = -1; |
} |
} else if ( !strcmp(key,"newelim") ) |
|
nd_newelim = value?1:0; |
|
else if ( !strcmp(key,"intersect") ) |
|
nd_intersect = value?1:0; |
} |
} |
} |
} |