version 1.167, 2009/02/08 02:47:09 |
version 1.170, 2009/02/11 03:04:42 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.166 2009/02/03 08:08:01 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.169 2009/02/10 06:33:08 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 1476 int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp |
|
Line 1476 int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp |
|
|
|
/* input : list of NDV, cand : list of NDV */ |
/* input : list of NDV, cand : list of NDV */ |
|
|
int ndv_check_candidate(NODE input,int obpe,int oadv,EPOS oepos,NODE cand) |
int ndv_check_membership(int m,NODE input,int obpe,int oadv,EPOS oepos,NODE cand) |
{ |
{ |
int n,i,stat; |
int n,i,stat; |
ND nf,d; |
ND nf,d; |
NDV r; |
NDV r; |
NODE t,s; |
NODE t,s; |
union oNDC dn; |
union oNDC dn; |
|
Q q; |
|
LIST list; |
|
|
ndv_setup(0,0,cand,0,1); |
ndv_setup(m,0,cand,GenTrace?1:0,1); |
n = length(cand); |
n = length(cand); |
|
|
|
if ( GenTrace ) { nd_alltracelist = 0; nd_tracelist = 0; } |
/* membercheck : list is a subset of Id(cand) ? */ |
/* membercheck : list is a subset of Id(cand) ? */ |
for ( t = input; t; t = NEXT(t) ) { |
for ( t = input, i = 0; t; t = NEXT(t), i++ ) { |
again: |
again: |
|
nd_tracelist = 0; |
if ( nd_bpe > obpe ) |
if ( nd_bpe > obpe ) |
r = ndv_dup_realloc((NDV)BDY(t),obpe,oadv,oepos); |
r = ndv_dup_realloc((NDV)BDY(t),obpe,oadv,oepos); |
else |
else |
|
|
nd_reconstruct(0,0); |
nd_reconstruct(0,0); |
goto again; |
goto again; |
} else if ( nf ) return 0; |
} else if ( nf ) return 0; |
|
if ( GenTrace ) { |
|
nd_tracelist = reverse_node(nd_tracelist); |
|
MKLIST(list,nd_tracelist); |
|
STOQ(i,q); s = mknode(2,q,list); MKLIST(list,s); |
|
MKNODE(s,list,nd_alltracelist); |
|
nd_alltracelist = s; nd_tracelist = 0; |
|
} |
if ( DP_Print ) { printf("."); fflush(stdout); } |
if ( DP_Print ) { printf("."); fflush(stdout); } |
} |
} |
if ( DP_Print ) { printf("\n"); } |
if ( DP_Print ) { printf("\n"); } |
/* gbcheck : cand is a GB of Id(cand) ? */ |
|
if ( !nd_gb(0,0,1,0) ) return 0; |
|
/* XXX */ |
|
return 1; |
return 1; |
} |
} |
|
|
Line 1845 int do_diagonalize(int sugar,int m) |
|
Line 1853 int do_diagonalize(int sugar,int m) |
|
|
|
/* return value = 0 => input is not a GB */ |
/* return value = 0 => input is not a GB */ |
|
|
NODE nd_gb(int m,int ishomo,int checkonly,int **indp) |
NODE nd_gb(int m,int ishomo,int checkonly,int gensyz,int **indp) |
{ |
{ |
int i,nh,sugar,stat; |
int i,nh,sugar,stat; |
NODE r,g,t; |
NODE r,g,t; |
Line 1861 NODE nd_gb(int m,int ishomo,int checkonly,int **indp) |
|
Line 1869 NODE nd_gb(int m,int ishomo,int checkonly,int **indp) |
|
|
|
g = 0; d = 0; |
g = 0; d = 0; |
for ( i = 0; i < nd_psn; i++ ) { |
for ( i = 0; i < nd_psn; i++ ) { |
d = update_pairs(d,g,i); |
d = update_pairs(d,g,i,gensyz); |
g = update_base(g,i); |
g = update_base(g,i); |
} |
} |
sugar = 0; |
sugar = 0; |
|
|
d = nd_reconstruct(0,d); |
d = nd_reconstruct(0,d); |
goto again; |
goto again; |
} else if ( nf ) { |
} else if ( nf ) { |
if ( checkonly ) return 0; |
if ( checkonly || gensyz ) 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); |
|
|
goto again; |
goto again; |
} |
} |
} |
} |
d = update_pairs(d,g,nh); |
d = update_pairs(d,g,nh,0); |
g = update_base(g,nh); |
g = update_base(g,nh); |
FREENDP(l); |
FREENDP(l); |
} else { |
} else { |
|
if ( GenTrace && gensyz ) { |
|
nd_tracelist = reverse_node(nd_tracelist); |
|
MKLIST(list,nd_tracelist); |
|
STOQ(-1,q); t = mknode(2,q,list); MKLIST(list,t); |
|
MKNODE(t,list,nd_alltracelist); |
|
nd_alltracelist = t; nd_tracelist = 0; |
|
} |
if ( DP_Print ) { printf("."); fflush(stdout); } |
if ( DP_Print ) { printf("."); fflush(stdout); } |
FREENDP(l); |
FREENDP(l); |
} |
} |
Line 2028 NODE nd_gb_trace(int m,int ishomo,int **indp) |
|
Line 2043 NODE nd_gb_trace(int m,int ishomo,int **indp) |
|
init_eg(&eg_le); |
init_eg(&eg_le); |
g = 0; d = 0; |
g = 0; d = 0; |
for ( i = 0; i < nd_psn; i++ ) { |
for ( i = 0; i < nd_psn; i++ ) { |
d = update_pairs(d,g,i); |
d = update_pairs(d,g,i,0); |
g = update_base(g,i); |
g = update_base(g,i); |
} |
} |
sugar = 0; |
sugar = 0; |
|
|
goto again; |
goto again; |
} |
} |
} |
} |
d = update_pairs(d,g,nh); |
d = update_pairs(d,g,nh,0); |
g = update_base(g,nh); |
g = update_base(g,nh); |
} else { |
} else { |
if ( DP_Print ) { printf("*"); fflush(stdout); } |
if ( DP_Print ) { printf("*"); fflush(stdout); } |
Line 2223 NODE ndv_reduceall(int m,NODE f) |
|
Line 2238 NODE ndv_reduceall(int m,NODE f) |
|
return a0; |
return a0; |
} |
} |
|
|
ND_pairs update_pairs( ND_pairs d, NODE /* of index */ g, int t) |
ND_pairs update_pairs( ND_pairs d, NODE /* of index */ g, int t, int gensyz) |
{ |
{ |
ND_pairs d1,nd,cur,head,prev,remove; |
ND_pairs d1,nd,cur,head,prev,remove; |
|
|
if ( !g ) return d; |
if ( !g ) return d; |
|
/* for testing */ |
|
if ( gensyz && GenSyz == 2 ) { |
|
d1 = nd_newpairs(g,t); |
|
if ( !d ) |
|
return d1; |
|
else { |
|
nd = d; |
|
while ( NEXT(nd) ) nd = NEXT(nd); |
|
NEXT(nd) = d1; |
|
return d; |
|
} |
|
} |
d = crit_B(d,t); |
d = crit_B(d,t); |
d1 = nd_newpairs(g,t); |
d1 = nd_newpairs(g,t); |
d1 = crit_M(d1); |
d1 = crit_M(d1); |
d1 = crit_F(d1); |
d1 = crit_F(d1); |
if ( do_weyl ) |
if ( gensyz || do_weyl ) |
head = d1; |
head = d1; |
else { |
else { |
prev = 0; cur = head = d1; |
prev = 0; cur = head = d1; |
Line 2619 void ndv_setup(int mod,int trace,NODE f,int dont_sort, |
|
Line 2646 void ndv_setup(int mod,int trace,NODE f,int dont_sort, |
|
} |
} |
if ( GenTrace ) { |
if ( GenTrace ) { |
STOQ(i,iq); STOQ(w[i].i,jq); node = mknode(3,iq,jq,ONE); |
STOQ(i,iq); STOQ(w[i].i,jq); node = mknode(3,iq,jq,ONE); |
ARG2(node) = (pointer) |
if ( !dont_removecont ) |
ndc_div(trace?0:mod,hc,HCU(a)); |
ARG2(node) = (pointer)ndc_div(trace?0:mod,hc,HCU(a)); |
MKLIST(l,node); NEXTNODE(nd_tracelist,tn); BDY(tn) = l; |
MKLIST(l,node); NEXTNODE(nd_tracelist,tn); BDY(tn) = l; |
} |
} |
NEWRHist(r); SG(r) = HTD(a); ndl_copy(HDL(a),DL(r)); |
NEWRHist(r); SG(r) = HTD(a); ndl_copy(HDL(a),DL(r)); |
Line 2758 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2785 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Obj obj; |
Obj obj; |
NumberField nf; |
NumberField nf; |
struct order_spec *ord1; |
struct order_spec *ord1; |
NODE tr,tl1,tl2; |
NODE tr,tl1,tl2,tl3,tl4; |
LIST l1,l2,l3; |
LIST l1,l2,l3,l4,l5; |
int j; |
int j; |
Q jq; |
Q jq; |
int *perm; |
int *perm; |
|
EPOS oepos; |
|
int obpe,oadv,ompos; |
|
|
nd_module = 0; |
nd_module = 0; |
if ( !m && Demand ) nd_demand = 1; |
if ( !m && Demand ) nd_demand = 1; |
Line 2816 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2845 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
} |
} |
} |
} |
nd_setup_parameters(nvar,max); |
nd_setup_parameters(nvar,max); |
|
obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos; ompos = nd_mpos; |
ishomo = 1; |
ishomo = 1; |
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
if ( nd_module ) { |
if ( nd_module ) { |
Line 2837 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2867 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
if ( GenTrace ) { |
if ( 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,&perm); |
x = f4?nd_f4(m,&perm):nd_gb(m,ishomo,0,0,&perm); |
nd_demand = 0; |
nd_demand = 0; |
x = ndv_reducebase(x,perm); |
x = ndv_reducebase(x,perm); |
if ( GenTrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; } |
if ( GenTrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; } |
x = ndv_reduceall(m,x); |
x = ndv_reduceall(m,x); |
|
if ( GenTrace ) { |
|
tl2 = nd_alltracelist; nd_alltracelist = 0; |
|
ndv_check_membership(m,fd0,obpe,oadv,oepos,x); |
|
if ( GenTrace ) { |
|
tl3 = nd_alltracelist; nd_alltracelist = 0; |
|
} else tl3 = 0; |
|
nd_gb(m,0,1,GenSyz?1:0,0)!=0; |
|
if ( GenTrace && GenSyz ) { |
|
tl4 = nd_alltracelist; nd_alltracelist = 0; |
|
} else tl4 = 0; |
|
} |
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); |
Line 2852 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 |
|
r0 = postprocess_algcoef(av,alist,r0); |
r0 = postprocess_algcoef(av,alist,r0); |
MKLIST(*rp,r0); |
MKLIST(*rp,r0); |
if ( GenTrace ) { |
if ( GenTrace ) { |
tl2 = nd_alltracelist; nd_alltracelist = 0; |
|
tl1 = reverse_node(tl1); tl2 = reverse_node(tl2); |
tl1 = reverse_node(tl1); tl2 = reverse_node(tl2); |
|
tl3 = reverse_node(tl3); |
/* tl2 = [[i,[[*,j,*,*],...]],...] */ |
/* tl2 = [[i,[[*,j,*,*],...]],...] */ |
for ( t = tl2; t; t = NEXT(t) ) { |
for ( t = tl2; t; t = NEXT(t) ) { |
/* s = [i,[*,j,*,*],...] */ |
/* s = [i,[*,j,*,*],...] */ |
Line 2867 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2908 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
for ( j = length(x)-1, t = 0; j >= 0; j-- ) { |
for ( j = length(x)-1, t = 0; j >= 0; j-- ) { |
STOQ(perm[j],jq); MKNODE(s,jq,t); t = s; |
STOQ(perm[j],jq); MKNODE(s,jq,t); t = s; |
} |
} |
MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t); |
MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t); MKLIST(l4,tl3); |
tr = mknode(5,*rp,0,l1,l2,l3); MKLIST(*rp,tr); |
MKLIST(l5,tl4); |
|
tr = mknode(7,*rp,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 2937 void nd_gr_postproc(LIST f,LIST v,int m,struct order_s |
|
Line 2979 void nd_gr_postproc(LIST f,LIST v,int m,struct order_s |
|
for ( x = 0, i = 0; i < nd_psn; i++ ) |
for ( x = 0, i = 0; i < nd_psn; i++ ) |
x = update_base(x,i); |
x = update_base(x,i); |
if ( do_check ) { |
if ( do_check ) { |
x = nd_gb(m,ishomo,1,&perm); |
x = nd_gb(m,ishomo,1,0,&perm); |
if ( !x ) { |
if ( !x ) { |
*rp = 0; |
*rp = 0; |
return; |
return; |
Line 2976 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3018 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
NumberField nf; |
NumberField nf; |
struct order_spec *ord1; |
struct order_spec *ord1; |
struct oEGT eg_check,eg0,eg1; |
struct oEGT eg_check,eg0,eg1; |
NODE tr,tl1,tl2; |
NODE tr,tl1,tl2,tl3,tl4; |
LIST l1,l2,l3; |
LIST l1,l2,l3,l4,l5; |
int *perm; |
int *perm; |
int j; |
int j,ret; |
Q jq; |
Q jq; |
|
|
nd_module = 0; |
nd_module = 0; |
Line 3101 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3143 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
if ( nocheck ) |
if ( nocheck ) |
break; |
break; |
get_eg(&eg0); |
get_eg(&eg0); |
if ( ndv_check_candidate(in0,obpe,oadv,oepos,cand) ) |
if ( ret = ndv_check_membership(0,in0,obpe,oadv,oepos,cand) ) { |
/* success */ |
if ( GenTrace ) { |
break; |
tl3 = nd_alltracelist; nd_alltracelist = 0; |
|
} else tl3 = 0; |
|
/* gbcheck : cand is a GB of Id(cand) ? */ |
|
ret = nd_gb(0,0,1,GenSyz?1:0,0)!=0; |
|
if ( GenTrace && GenSyz ) { |
|
tl4 = nd_alltracelist; nd_alltracelist = 0; |
|
} else tl4 = 0; |
|
} |
|
if ( ret ) break; |
else if ( trace > 1 ) { |
else if ( trace > 1 ) { |
/* failure */ |
/* failure */ |
*rp = 0; return; |
*rp = 0; return; |
Line 3135 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3185 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
MKLIST(*rp,cand); |
MKLIST(*rp,cand); |
if ( GenTrace ) { |
if ( GenTrace ) { |
tl1 = reverse_node(tl1); tl2 = reverse_node(tl2); |
tl1 = reverse_node(tl1); tl2 = reverse_node(tl2); |
|
tl3 = reverse_node(tl3); |
/* tl2 = [[i,[[*,j,*,*],...]],...] */ |
/* tl2 = [[i,[[*,j,*,*],...]],...] */ |
for ( t = tl2; t; t = NEXT(t) ) { |
for ( t = tl2; t; t = NEXT(t) ) { |
/* s = [i,[*,j,*,*],...] */ |
/* s = [i,[*,j,*,*],...] */ |
Line 3148 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3199 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
for ( j = length(cand)-1, t = 0; j >= 0; j-- ) { |
for ( j = length(cand)-1, t = 0; j >= 0; j-- ) { |
STOQ(perm[j],jq); MKNODE(s,jq,t); t = s; |
STOQ(perm[j],jq); MKNODE(s,jq,t); t = s; |
} |
} |
MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t); |
MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t); MKLIST(l4,tl3); |
tr = mknode(5,*rp,homo?ONE:0,l1,l2,l3); MKLIST(*rp,tr); |
MKLIST(l5,tl4); |
|
tr = mknode(7,*rp,(!ishomo&&homo)?ONE:0,l1,l2,l3,l4,l5); MKLIST(*rp,tr); |
} |
} |
} |
} |
|
|
Line 5346 NODE nd_f4(int m,int **indp) |
|
Line 5398 NODE nd_f4(int m,int **indp) |
|
#endif |
#endif |
g = 0; d = 0; |
g = 0; d = 0; |
for ( i = 0; i < nd_psn; i++ ) { |
for ( i = 0; i < nd_psn; i++ ) { |
d = update_pairs(d,g,i); |
d = update_pairs(d,g,i,0); |
g = update_base(g,i); |
g = update_base(g,i); |
} |
} |
while ( d ) { |
while ( d ) { |
Line 5390 NODE nd_f4(int m,int **indp) |
|
Line 5442 NODE nd_f4(int m,int **indp) |
|
nf = ndtondv(m,nf1); |
nf = ndtondv(m,nf1); |
} |
} |
nh = ndv_newps(m,nf,0); |
nh = ndv_newps(m,nf,0); |
d = update_pairs(d,g,nh); |
d = update_pairs(d,g,nh,0); |
g = update_base(g,nh); |
g = update_base(g,nh); |
} |
} |
} |
} |
Line 5424 NODE nd_f4_trace(int m,int **indp) |
|
Line 5476 NODE nd_f4_trace(int m,int **indp) |
|
|
|
g = 0; d = 0; |
g = 0; d = 0; |
for ( i = 0; i < nd_psn; i++ ) { |
for ( i = 0; i < nd_psn; i++ ) { |
d = update_pairs(d,g,i); |
d = update_pairs(d,g,i,0); |
g = update_base(g,i); |
g = update_base(g,i); |
} |
} |
while ( d ) { |
while ( d ) { |
Line 5490 NODE nd_f4_trace(int m,int **indp) |
|
Line 5542 NODE nd_f4_trace(int m,int **indp) |
|
ndv_mod(m,nfv); |
ndv_mod(m,nfv); |
ndv_removecont(m,nfv); |
ndv_removecont(m,nfv); |
nh = ndv_newps(0,nfv,nfqv); |
nh = ndv_newps(0,nfv,nfqv); |
d = update_pairs(d,g,nh); |
d = update_pairs(d,g,nh,0); |
g = update_base(g,nh); |
g = update_base(g,nh); |
} |
} |
} |
} |