version 1.180, 2010/02/05 04:24:00 |
version 1.187, 2010/04/26 01:06:22 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.179 2010/02/03 07:23:06 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.186 2010/04/23 07:35:44 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 50 static int nd_module,nd_ispot,nd_mpos,nd_pot_nelim; |
|
Line 50 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; |
|
static int *nd_gbblock; |
|
|
NumberField get_numberfield(); |
NumberField get_numberfield(); |
UINT *nd_det_compute_bound(NDV **dm,int n,int j); |
UINT *nd_det_compute_bound(NDV **dm,int n,int j); |
Line 2300 ND_pairs nd_newpairs( NODE g, int t ) |
|
Line 2301 ND_pairs nd_newpairs( NODE g, int t ) |
|
{ |
{ |
NODE h; |
NODE h; |
UINT *dl; |
UINT *dl; |
int ts,s; |
int ts,s,i,t0,min,max; |
ND_pairs r,r0; |
ND_pairs r,r0; |
|
|
dl = DL(nd_psh[t]); |
dl = DL(nd_psh[t]); |
Line 2308 ND_pairs nd_newpairs( NODE g, int t ) |
|
Line 2309 ND_pairs nd_newpairs( NODE g, int t ) |
|
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; |
|
if ( nd_gbblock ) { |
|
t0 = (long)BDY(h); |
|
for ( i = 0; nd_gbblock[i] >= 0; i += 2 ) { |
|
min = nd_gbblock[i]; max = nd_gbblock[i+1]; |
|
if ( t0 >= min && t0 <= max && t >= min && t <= max ) |
|
break; |
|
} |
|
if ( nd_gbblock[i] >= 0 ) { |
|
fprintf(stderr,"(%d,%d)",t0,t); |
|
continue; |
|
} |
|
} |
NEXTND_pairs(r0,r); |
NEXTND_pairs(r0,r); |
r->i1 = (long)BDY(h); |
r->i1 = (long)BDY(h); |
r->i2 = t; |
r->i2 = t; |
Line 2786 NODE postprocess_algcoef(VL av,NODE alist,NODE r) |
|
Line 2799 NODE postprocess_algcoef(VL av,NODE alist,NODE r) |
|
return u0; |
return u0; |
} |
} |
|
|
void nd_gr(LIST f,LIST v,int m,int f4,struct order_spec *ord,LIST *rp) |
void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct order_spec *ord,LIST *rp) |
{ |
{ |
VL tv,fv,vv,vc,av; |
VL tv,fv,vv,vc,av; |
NODE fd,fd0,r,r0,t,x,s,xx,alist; |
NODE fd,fd0,r,r0,t,x,s,xx,alist; |
int e,max,nvar,i; |
int e,max,nvar,i; |
NDV b; |
NDV b; |
int ishomo,nalg,mrank,trank; |
int ishomo,nalg,mrank,trank,wmax,len; |
|
NMV a; |
Alg alpha,dp; |
Alg alpha,dp; |
P p,zp; |
P p,zp; |
Q dmy; |
Q dmy; |
Line 2879 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2893 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
if ( b ) { NEXTNODE(fd0,fd); BDY(fd) = (pointer)b; } |
if ( b ) { NEXTNODE(fd0,fd); BDY(fd) = (pointer)b; } |
} |
} |
if ( fd0 ) NEXT(fd) = 0; |
if ( fd0 ) NEXT(fd) = 0; |
ndv_setup(m,0,fd0,0,0); |
|
|
if ( !ishomo && homo ) { |
|
for ( t = fd0, wmax = max; t; t = NEXT(t) ) { |
|
b = (NDV)BDY(t); len = LEN(b); |
|
for ( a = BDY(b), i = 0; i < len; i++, NMV_ADV(a) ) |
|
wmax = MAX(TD(DL(a)),wmax); |
|
} |
|
homogenize_order(ord,nvar,&ord1); |
|
nd_init_ord(ord1); |
|
nd_setup_parameters(nvar+1,wmax); |
|
for ( t = fd0; t; t = NEXT(t) ) |
|
ndv_homogenize((NDV)BDY(t),obpe,oadv,oepos,ompos); |
|
} |
|
|
|
ndv_setup(m,0,fd0,nd_gbblock?1:0,0); |
if ( nd_gentrace ) { |
if ( nd_gentrace ) { |
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,0,0,&perm); |
x = f4?nd_f4(m,&perm):nd_gb(m,ishomo || homo,0,0,&perm); |
|
if ( !ishomo && homo ) { |
|
/* dehomogenization */ |
|
for ( t = x; t; t = NEXT(t) ) ndv_dehomogenize((NDV)BDY(t),ord); |
|
nd_init_ord(ord); |
|
nd_setup_parameters(nvar,0); |
|
} |
nd_demand = 0; |
nd_demand = 0; |
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; } |
Line 2926 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2960 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
} |
} |
MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t); MKLIST(l4,tl3); |
MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t); MKLIST(l4,tl3); |
MKLIST(l5,tl4); |
MKLIST(l5,tl4); |
tr = mknode(7,*rp,0,l1,l2,l3,l4,l5); MKLIST(*rp,tr); |
tr = mknode(7,*rp,(!ishomo&&homo)?ONE:0,l1,l2,l3,l4,l5); MKLIST(*rp,tr); |
} |
} |
#if 0 |
#if 0 |
fprintf(asir_out,"ndv_alloc=%d\n",ndv_alloc); |
fprintf(asir_out,"ndv_alloc=%d\n",ndv_alloc); |
Line 3137 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3171 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
ndv_homogenize((NDV)BDY(t),obpe,oadv,oepos,ompos); |
ndv_homogenize((NDV)BDY(t),obpe,oadv,oepos,ompos); |
} |
} |
while ( 1 ) { |
while ( 1 ) { |
|
tl1 = tl2 = tl3 = tl4 = 0; |
if ( Demand ) |
if ( Demand ) |
nd_demand = 1; |
nd_demand = 1; |
|
ret = ndv_setup(m,1,fd0,nd_gbblock?1:0,0); |
if ( nd_gentrace ) { |
if ( nd_gentrace ) { |
MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); |
MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); |
} |
} |
ret = ndv_setup(m,1,fd0,0,0); |
|
if ( ret ) |
if ( ret ) |
cand = f4?nd_f4_trace(m,&perm):nd_gb_trace(m,ishomo || homo,&perm); |
cand = f4?nd_f4_trace(m,&perm):nd_gb_trace(m,ishomo || homo,&perm); |
if ( !ret || !cand ) { |
if ( !ret || !cand ) { |
Line 4123 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
Line 4158 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
ndl_add(DL(tab[u]),d,DL(t)); |
ndl_add(DL(tab[u]),d,DL(t)); |
if ( mod ) { |
if ( mod ) { |
c0 = CM(tab[u]); DMAR(c0,c,0,mod,c1); CM(t) = c1; |
c0 = CM(tab[u]); DMAR(c0,c,0,mod,c1); CM(t) = c1; |
} if ( nd_vc ) |
} else if ( nd_vc ) |
mulp(nd_vc,CP(tab[u]),(P)q,&CP(t)); |
mulp(nd_vc,CP(tab[u]),(P)q,&CP(t)); |
else |
else |
mulq(CQ(tab[u]),q,&CQ(t)); |
mulq(CQ(tab[u]),q,&CQ(t)); |
Line 6567 void nd_det(int mod,MAT f,P *rp) |
|
Line 6602 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 6906 void conv_ilist(int demand,int trace,NODE g,int **indp |
|
Line 6949 void conv_ilist(int demand,int trace,NODE g,int **indp |
|
|
|
void parse_nd_option(NODE opt) |
void parse_nd_option(NODE opt) |
{ |
{ |
NODE t,p; |
NODE t,p,u; |
|
int i,s; |
char *key; |
char *key; |
Obj value; |
Obj value; |
|
|
nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; |
nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; nd_gbblock = 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 6921 void parse_nd_option(NODE opt) |
|
Line 6965 void parse_nd_option(NODE opt) |
|
nd_gensyz = value?1:0; |
nd_gensyz = value?1:0; |
else if ( !strcmp(key,"nora") ) |
else if ( !strcmp(key,"nora") ) |
nd_nora = value?1:0; |
nd_nora = value?1:0; |
|
else if ( !strcmp(key,"gbblock") ) { |
|
if ( !value || OID(value) != O_LIST ) |
|
error("nd_* : invalid value for gbblock option"); |
|
u = BDY((LIST)value); |
|
nd_gbblock = MALLOC(2*length(t)+1); |
|
for ( i = 0; u; u = NEXT(u) ) { |
|
p = BDY((LIST)BDY(u)); |
|
s = nd_gbblock[i++] = QTOS((Q)BDY(p)); |
|
nd_gbblock[i++] = s+QTOS((Q)BDY(NEXT(p)))-1; |
|
} |
|
nd_gbblock[i] = -1; |
|
} |
} |
} |
} |
} |