version 1.167, 2009/02/08 02:47:09 |
version 1.172, 2009/02/15 03:07:41 |
|
|
/* $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.171 2009/02/11 06:30:21 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; |
static int nd_module,nd_ispot,nd_mpos; |
static NODE nd_tracelist; |
static NODE nd_tracelist; |
static NODE nd_alltracelist; |
static NODE nd_alltracelist; |
|
static int nd_gentrace,nd_gensyz; |
|
|
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 67 P ndc_div(int mod,union oNDC a,union oNDC b); |
|
Line 68 P ndc_div(int mod,union oNDC a,union oNDC b); |
|
P ndctop(int mod,union oNDC c); |
P ndctop(int mod,union oNDC c); |
void finalize_tracelist(int i,P cont); |
void finalize_tracelist(int i,P cont); |
void conv_ilist(int demand,int trace,NODE g,int **indp); |
void conv_ilist(int demand,int trace,NODE g,int **indp); |
|
void parse_nd_option(NODE opt); |
|
|
extern int Denominator,DP_Multiple; |
extern int Denominator,DP_Multiple; |
|
|
Line 1325 int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND |
|
Line 1327 int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND |
|
p = nd_demand ? ndv_load(index) : ps[index]; |
p = nd_demand ? ndv_load(index) : ps[index]; |
/* d+g -> div*(d+g)+mul*p */ |
/* d+g -> div*(d+g)+mul*p */ |
g = nd_reduce2(mod,d,g,p,mul,dn,&div); |
g = nd_reduce2(mod,d,g,p,mul,dn,&div); |
if ( GenTrace ) { |
if ( nd_gentrace ) { |
/* Trace=[div,index,mul,ONE] */ |
/* Trace=[div,index,mul,ONE] */ |
STOQ(index,iq); |
STOQ(index,iq); |
nmtodp(mod,mul,&dmul); |
nmtodp(mod,mul,&dmul); |
Line 1335 int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND |
|
Line 1337 int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND |
|
if ( !mod && g && ((double)(p_mag(HCP(g))) > hmag) ) { |
if ( !mod && g && ((double)(p_mag(HCP(g))) > hmag) ) { |
hg = HCU(g); |
hg = HCU(g); |
nd_removecont2(d,g); |
nd_removecont2(d,g); |
if ( dn || GenTrace ) { |
if ( dn || nd_gentrace ) { |
/* overwrite cont : Trace=[div,index,mul,cont] */ |
/* overwrite cont : Trace=[div,index,mul,cont] */ |
cont = ndc_div(mod,hg,HCU(g)); |
cont = ndc_div(mod,hg,HCU(g)); |
if ( dn ) { |
if ( dn ) { |
Line 1344 int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND |
|
Line 1346 int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND |
|
reductr(nd_vc,(Obj)tr,&tr1); dn->r = (R)tr1; |
reductr(nd_vc,(Obj)tr,&tr1); dn->r = (R)tr1; |
} else divq(dn->z,(Q)cont,&dn->z); |
} else divq(dn->z,(Q)cont,&dn->z); |
} |
} |
if ( GenTrace && !UNIQ(cont) ) ARG3(node) = (pointer)cont; |
if ( nd_gentrace && !UNIQ(cont) ) ARG3(node) = (pointer)cont; |
} |
} |
hmag = ((double)p_mag(HCP(g)))*nd_scale; |
hmag = ((double)p_mag(HCP(g)))*nd_scale; |
} |
} |
Line 1476 int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp |
|
Line 1478 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,nd_gentrace?1:0,1); |
n = length(cand); |
n = length(cand); |
|
|
|
if ( nd_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 |
r = (NDV)BDY(t); |
r = (NDV)BDY(t); |
d = ndvtond(0,r); |
d = ndvtond(m,r); |
stat = nd_nf(0,0,d,nd_ps,0,0,&nf); |
stat = nd_nf(m,0,d,nd_ps,0,0,&nf); |
if ( !stat ) { |
if ( !stat ) { |
nd_reconstruct(0,0); |
nd_reconstruct(0,0); |
goto again; |
goto again; |
} else if ( nf ) return 0; |
} else if ( nf ) return 0; |
|
if ( nd_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 1813 int do_diagonalize(int sugar,int m) |
|
Line 1823 int do_diagonalize(int sugar,int m) |
|
Q iq; |
Q iq; |
|
|
for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) { |
for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) { |
if ( GenTrace ) { |
if ( nd_gentrace ) { |
/* Trace = [1,index,1,1] */ |
/* Trace = [1,index,1,1] */ |
STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE); |
STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE); |
MKLIST(l,node); MKNODE(nd_tracelist,l,0); |
MKLIST(l,node); MKNODE(nd_tracelist,l,0); |
Line 1829 int do_diagonalize(int sugar,int m) |
|
Line 1839 int do_diagonalize(int sugar,int m) |
|
ndv_free(nfv); |
ndv_free(nfv); |
hc = HCU(nf); nd_removecont(m,nf); |
hc = HCU(nf); nd_removecont(m,nf); |
cont = ndc_div(m,hc,HCU(nf)); |
cont = ndc_div(m,hc,HCU(nf)); |
if ( GenTrace ) finalize_tracelist(i,cont); |
if ( nd_gentrace ) finalize_tracelist(i,cont); |
nfv = ndtondv(m,nf); |
nfv = ndtondv(m,nf); |
nd_free(nf); |
nd_free(nf); |
nd_bound[i] = ndv_compute_bound(nfv); |
nd_bound[i] = ndv_compute_bound(nfv); |
Line 1845 int do_diagonalize(int sugar,int m) |
|
Line 1855 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 1871 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; |
|
|
goto again; |
goto again; |
} |
} |
#if USE_GEOBUCKET |
#if USE_GEOBUCKET |
stat = (m&&!GenTrace)?nd_nf_pbucket(m,h,nd_ps,!Top,&nf) |
stat = (m&&!nd_gentrace)?nd_nf_pbucket(m,h,nd_ps,!Top,&nf) |
:nd_nf(m,0,h,nd_ps,!Top,0,&nf); |
:nd_nf(m,0,h,nd_ps,!Top,0,&nf); |
#else |
#else |
stat = nd_nf(m,0,h,nd_ps,!Top,0,&nf); |
stat = nd_nf(m,0,h,nd_ps,!Top,0,&nf); |
|
|
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); |
|
|
nd_monic(0,&nf); |
nd_monic(0,&nf); |
nd_removecont(m,nf); |
nd_removecont(m,nf); |
} |
} |
if ( 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,0,0,0,cont); |
|
|
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 ( nd_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 1952 int do_diagonalize_trace(int sugar,int m) |
|
Line 1969 int do_diagonalize_trace(int sugar,int m) |
|
P cont,cont1; |
P cont,cont1; |
|
|
for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) { |
for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) { |
if ( GenTrace ) { |
if ( nd_gentrace ) { |
/* Trace = [1,index,1,1] */ |
/* Trace = [1,index,1,1] */ |
STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE); |
STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE); |
MKLIST(l,node); MKNODE(nd_tracelist,l,0); |
MKLIST(l,node); MKNODE(nd_tracelist,l,0); |
Line 1979 int do_diagonalize_trace(int sugar,int m) |
|
Line 1996 int do_diagonalize_trace(int sugar,int m) |
|
ndv_free(nfv); |
ndv_free(nfv); |
hc = HCU(nf); nd_removecont(0,nf); |
hc = HCU(nf); nd_removecont(0,nf); |
cont = ndc_div(0,hc,HCU(nf)); |
cont = ndc_div(0,hc,HCU(nf)); |
if ( GenTrace ) finalize_tracelist(i,cont); |
if ( nd_gentrace ) finalize_tracelist(i,cont); |
nfv = ndtondv(0,nf); |
nfv = ndtondv(0,nf); |
nd_free(nf); |
nd_free(nf); |
nd_bound[i] = ndv_compute_bound(nfv); |
nd_bound[i] = ndv_compute_bound(nfv); |
Line 2028 NODE nd_gb_trace(int m,int ishomo,int **indp) |
|
Line 2045 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; |
|
|
nd_removecont(0,nfq); nfqv = ndtondv(0,nfq); nd_free(nfq); |
nd_removecont(0,nfq); nfqv = ndtondv(0,nfq); nd_free(nfq); |
nd_removecont(m,nf); nfv = ndtondv(m,nf); nd_free(nf); |
nd_removecont(m,nf); nfv = ndtondv(m,nf); nd_free(nf); |
} |
} |
if ( 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,0,0,0,cont); |
|
|
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 2178 NODE ndv_reduceall(int m,NODE f) |
|
Line 2195 NODE ndv_reduceall(int m,NODE f) |
|
n = length(f); |
n = length(f); |
ndv_setup(m,0,f,0,1); |
ndv_setup(m,0,f,0,1); |
perm = (int *)MALLOC(n*sizeof(int)); |
perm = (int *)MALLOC(n*sizeof(int)); |
if ( GenTrace ) { |
if ( nd_gentrace ) { |
for ( t = nd_tracelist, i = 0; i < n; i++, t = NEXT(t) ) |
for ( t = nd_tracelist, i = 0; i < n; i++, t = NEXT(t) ) |
perm[i] = QTOS((Q)ARG1(BDY((LIST)BDY(t)))); |
perm[i] = QTOS((Q)ARG1(BDY((LIST)BDY(t)))); |
} |
} |
for ( i = 0; i < n; ) { |
for ( i = 0; i < n; ) { |
if ( GenTrace ) { |
if ( nd_gentrace ) { |
/* Trace = [1,index,1,1] */ |
/* Trace = [1,index,1,1] */ |
STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE); |
STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE); |
MKLIST(l,node); MKNODE(nd_tracelist,l,0); |
MKLIST(l,node); MKNODE(nd_tracelist,l,0); |
Line 2197 NODE ndv_reduceall(int m,NODE f) |
|
Line 2214 NODE ndv_reduceall(int m,NODE f) |
|
if ( DP_Print ) { printf("."); fflush(stdout); } |
if ( DP_Print ) { printf("."); fflush(stdout); } |
ndv_free(nd_ps[i]); |
ndv_free(nd_ps[i]); |
hc = HCU(nf); nd_removecont(m,nf); |
hc = HCU(nf); nd_removecont(m,nf); |
if ( GenTrace ) { |
if ( nd_gentrace ) { |
for ( t = nd_tracelist; t; t = NEXT(t) ) { |
for ( t = nd_tracelist; t; t = NEXT(t) ) { |
jq = ARG1(BDY((LIST)BDY(t))); j = QTOS(jq); |
jq = ARG1(BDY((LIST)BDY(t))); j = QTOS(jq); |
STOQ(perm[j],jq); ARG1(BDY((LIST)BDY(t))) = jq; |
STOQ(perm[j],jq); ARG1(BDY((LIST)BDY(t))) = jq; |
Line 2213 NODE ndv_reduceall(int m,NODE f) |
|
Line 2230 NODE ndv_reduceall(int m,NODE f) |
|
if ( DP_Print ) { printf("\n"); } |
if ( DP_Print ) { printf("\n"); } |
for ( a0 = 0, i = 0; i < n; i++ ) { |
for ( a0 = 0, i = 0; i < n; i++ ) { |
NEXTNODE(a0,a); |
NEXTNODE(a0,a); |
if ( !GenTrace ) BDY(a) = (pointer)nd_ps[i]; |
if ( !nd_gentrace ) BDY(a) = (pointer)nd_ps[i]; |
else { |
else { |
for ( j = 0; j < n; j++ ) if ( perm[j] == i ) break; |
for ( j = 0; j < n; j++ ) if ( perm[j] == i ) break; |
BDY(a) = (pointer)nd_ps[j]; |
BDY(a) = (pointer)nd_ps[j]; |
Line 2223 NODE ndv_reduceall(int m,NODE f) |
|
Line 2240 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 && nd_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 2546 int ndv_newps(int m,NDV a,NDV aq) |
|
Line 2575 int ndv_newps(int m,NDV a,NDV aq) |
|
nd_ps[nd_psn] = 0; |
nd_ps[nd_psn] = 0; |
} |
} |
} |
} |
if ( GenTrace ) { |
if ( nd_gentrace ) { |
/* reverse the tracelist and append it to alltracelist */ |
/* reverse the tracelist and append it to alltracelist */ |
nd_tracelist = reverse_node(nd_tracelist); MKLIST(l,nd_tracelist); |
nd_tracelist = reverse_node(nd_tracelist); MKLIST(l,nd_tracelist); |
STOQ(nd_psn,iq); tn = mknode(2,iq,l); MKLIST(l,tn); |
STOQ(nd_psn,iq); tn = mknode(2,iq,l); MKLIST(l,tn); |
Line 2617 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 ( mod || !dont_removecont ) ndv_removecont(mod,a); |
if ( mod || !dont_removecont ) ndv_removecont(mod,a); |
if ( !mod ) register_hcf(a); |
if ( !mod ) register_hcf(a); |
} |
} |
if ( GenTrace ) { |
if ( nd_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 2636 void ndv_setup(int mod,int trace,NODE f,int dont_sort, |
|
Line 2665 void ndv_setup(int mod,int trace,NODE f,int dont_sort, |
|
} |
} |
} |
} |
} |
} |
if ( GenTrace && nd_tracelist ) NEXT(tn) = 0; |
if ( nd_gentrace && nd_tracelist ) NEXT(tn) = 0; |
} |
} |
|
|
struct order_spec *append_block(struct order_spec *spec, |
struct order_spec *append_block(struct order_spec *spec, |
Line 2758 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2787 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; |
if ( !m && Demand ) nd_demand = 1; |
if ( !m && Demand ) nd_demand = 1; |
else nd_demand = 0; |
else nd_demand = 0; |
|
parse_nd_option(current_option); |
|
|
if ( DP_Multiple ) |
if ( DP_Multiple ) |
nd_scale = ((double)DP_Multiple)/(double)(Denominator?Denominator:1); |
nd_scale = ((double)DP_Multiple)/(double)(Denominator?Denominator:1); |
Line 2816 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2848 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 ) { |
if ( !m && !GenTrace ) pltozpl((LIST)BDY(t),&dmy,&zpl); |
if ( !m && !nd_gentrace ) pltozpl((LIST)BDY(t),&dmy,&zpl); |
else zpl = (LIST)BDY(t); |
else zpl = (LIST)BDY(t); |
b = (pointer)pltondv(CO,vv,zpl); |
b = (pointer)pltondv(CO,vv,zpl); |
} else { |
} else { |
if ( !m && !GenTrace ) ptozp((P)BDY(t),1,&dmy,&zp); |
if ( !m && !nd_gentrace ) ptozp((P)BDY(t),1,&dmy,&zp); |
else zp = (P)BDY(t); |
else zp = (P)BDY(t); |
b = (pointer)ptondv(CO,vv,zp); |
b = (pointer)ptondv(CO,vv,zp); |
} |
} |
Line 2834 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 ( fd0 ) NEXT(fd) = 0; |
if ( fd0 ) NEXT(fd) = 0; |
ndv_setup(m,0,fd0,0,0); |
ndv_setup(m,0,fd0,0,0); |
if ( 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,&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 ( nd_gentrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; } |
x = ndv_reduceall(m,x); |
x = ndv_reduceall(m,x); |
|
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; |
|
if ( nd_gentrace && nd_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 2851 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2895 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
if ( nalg ) |
if ( nalg ) |
r0 = postprocess_algcoef(av,alist,r0); |
r0 = postprocess_algcoef(av,alist,r0); |
MKLIST(*rp,r0); |
MKLIST(*rp,r0); |
if ( GenTrace ) { |
if ( nd_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 2911 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 2982 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 3021 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; |
|
parse_nd_option(current_option); |
if ( DP_Multiple ) |
if ( DP_Multiple ) |
nd_scale = ((double)DP_Multiple)/(double)(Denominator?Denominator:1); |
nd_scale = ((double)DP_Multiple)/(double)(Denominator?Denominator:1); |
|
|
Line 3043 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3089 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
ishomo = 1; |
ishomo = 1; |
for ( in0 = 0, fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
for ( in0 = 0, fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
if ( nd_module ) { |
if ( nd_module ) { |
if ( !GenTrace ) pltozpl((LIST)BDY(t),&dmy,&zpl); |
if ( !nd_gentrace ) pltozpl((LIST)BDY(t),&dmy,&zpl); |
else zpl = (LIST)BDY(t); |
else zpl = (LIST)BDY(t); |
c = (pointer)pltondv(CO,vv,zpl); |
c = (pointer)pltondv(CO,vv,zpl); |
} else { |
} else { |
if ( !GenTrace ) ptozp((P)BDY(t),1,&dmy,&zp); |
if ( !nd_gentrace ) ptozp((P)BDY(t),1,&dmy,&zp); |
else zp = (P)BDY(t); |
else zp = (P)BDY(t); |
c = (pointer)ptondv(CO,vv,zp); |
c = (pointer)ptondv(CO,vv,zp); |
} |
} |
Line 3076 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3122 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
if ( Demand ) |
if ( Demand ) |
nd_demand = 1; |
nd_demand = 1; |
ndv_setup(m,1,fd0,0,0); |
ndv_setup(m,1,fd0,0,0); |
if ( GenTrace ) { |
if ( nd_gentrace ) { |
MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); |
MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0); |
} |
} |
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); |
Line 3094 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3140 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
} |
} |
nd_demand = 0; |
nd_demand = 0; |
cand = ndv_reducebase(cand,perm); |
cand = ndv_reducebase(cand,perm); |
if ( GenTrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; } |
if ( nd_gentrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; } |
cand = ndv_reduceall(0,cand); |
cand = ndv_reduceall(0,cand); |
cbpe = nd_bpe; |
cbpe = nd_bpe; |
if ( GenTrace ) { tl2 = nd_alltracelist; nd_alltracelist = 0; } |
if ( nd_gentrace ) { tl2 = nd_alltracelist; nd_alltracelist = 0; } |
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 ( nd_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,nd_gensyz?1:0,0)!=0; |
|
if ( nd_gentrace && nd_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 3133 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3187 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
if ( nalg ) |
if ( nalg ) |
cand = postprocess_algcoef(av,alist,cand); |
cand = postprocess_algcoef(av,alist,cand); |
MKLIST(*rp,cand); |
MKLIST(*rp,cand); |
if ( GenTrace ) { |
if ( nd_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 3203 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 3877 int nd_sp(int mod,int trace,ND_pairs p,ND *rp) |
|
Line 3933 int nd_sp(int mod,int trace,ND_pairs p,ND *rp) |
|
} |
} |
t1 = ndv_mul_nm(mod,m1,p1); t2 = ndv_mul_nm(mod,m2,p2); |
t1 = ndv_mul_nm(mod,m1,p1); t2 = ndv_mul_nm(mod,m2,p2); |
*rp = nd_add(mod,t1,t2); |
*rp = nd_add(mod,t1,t2); |
if ( GenTrace ) { |
if ( nd_gentrace ) { |
/* nd_tracelist is initialized */ |
/* nd_tracelist is initialized */ |
STOQ(p->i1,iq); nmtodp(mod,m1,&d); node = mknode(4,ONE,iq,d,ONE); |
STOQ(p->i1,iq); nmtodp(mod,m1,&d); node = mknode(4,ONE,iq,d,ONE); |
MKLIST(hist,node); MKNODE(nd_tracelist,hist,0); |
MKLIST(hist,node); MKNODE(nd_tracelist,hist,0); |
Line 5346 NODE nd_f4(int m,int **indp) |
|
Line 5402 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 5446 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 5480 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 5546 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); |
} |
} |
} |
} |
Line 6736 void conv_ilist(int demand,int trace,NODE g,int **indp |
|
Line 6792 void conv_ilist(int demand,int trace,NODE g,int **indp |
|
BDY(t) = (pointer)(demand?ndv_load(j):(trace?nd_ps_trace[j]:nd_ps[j])); |
BDY(t) = (pointer)(demand?ndv_load(j):(trace?nd_ps_trace[j]:nd_ps[j])); |
} |
} |
if ( indp ) *indp = ind; |
if ( indp ) *indp = ind; |
|
} |
|
|
|
void parse_nd_option(NODE opt) |
|
{ |
|
NODE t,p; |
|
char *key; |
|
Obj value; |
|
|
|
nd_gentrace = 0; nd_gensyz = 0; |
|
for ( t = opt; t; t = NEXT(t) ) { |
|
p = BDY((LIST)BDY(t)); |
|
key = BDY((STRING)BDY(p)); |
|
value = (Obj)BDY(NEXT(p)); |
|
if ( !strcmp(key,"gentrace") ) |
|
nd_gentrace = value?1:0; |
|
else if ( !strcmp(key,"gensyz") ) |
|
nd_gensyz = value?1:0; |
|
} |
} |
} |