version 1.167, 2009/02/08 02:47:09 |
version 1.169, 2009/02/10 06:33:08 |
|
|
/* $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.168 2009/02/09 10:21:29 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 1483 int ndv_check_candidate(NODE input,int obpe,int oadv,E |
|
Line 1483 int ndv_check_candidate(NODE input,int obpe,int oadv,E |
|
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(0,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 2837 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2864 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; } |
Line 2937 void nd_gr_postproc(LIST f,LIST v,int m,struct order_s |
|
Line 2964 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 3003 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 3128 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_candidate(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 3170 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 3184 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 5383 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 5427 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 5461 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 5527 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); |
} |
} |
} |
} |