version 1.67, 2003/09/12 14:51:27 |
version 1.69, 2003/09/15 09:49:44 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.66 2003/09/12 08:26:19 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.68 2003/09/12 15:07:11 noro Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
#include "inline.h" |
#include "inline.h" |
Line 42 typedef struct oNDV { |
|
Line 42 typedef struct oNDV { |
|
int sugar; |
int sugar; |
} *NDV; |
} *NDV; |
|
|
|
typedef union oNDC { |
|
int m; |
|
Q z; |
|
P p; |
|
} *NDC; |
|
|
/* monomial; linked list rep. */ |
/* monomial; linked list rep. */ |
typedef struct oNM { |
typedef struct oNM { |
struct oNM *next; |
struct oNM *next; |
union { |
union oNDC c; |
int m; |
|
Q z; |
|
P p; |
|
} c; |
|
UINT dl[1]; |
UINT dl[1]; |
} *NM; |
} *NM; |
|
|
/* monomial; array rep. */ |
/* monomial; array rep. */ |
typedef struct oNMV { |
typedef struct oNMV { |
union { |
union oNDC c; |
int m; |
|
Q z; |
|
P p; |
|
} c; |
|
UINT dl[1]; |
UINT dl[1]; |
} *NMV; |
} *NMV; |
|
|
Line 116 typedef struct oIndArray |
|
Line 114 typedef struct oIndArray |
|
|
|
int (*ndl_compare_function)(UINT *a1,UINT *a2); |
int (*ndl_compare_function)(UINT *a1,UINT *a2); |
|
|
|
static int nd_f4_nsp=0x7fffffff; |
static double nd_scale=2; |
static double nd_scale=2; |
static UINT **nd_bound; |
static UINT **nd_bound; |
static struct order_spec *nd_ord; |
static struct order_spec *nd_ord; |
Line 284 INLINE int ndl_hash_value(UINT *d); |
|
Line 283 INLINE int ndl_hash_value(UINT *d); |
|
|
|
/* normal forms */ |
/* normal forms */ |
INLINE int ndl_find_reducer(UINT *g); |
INLINE int ndl_find_reducer(UINT *g); |
INLINE int ndl_find_reducer_direct(UINT *g,NDV *ps,int len); |
|
int nd_sp(int mod,int trace,ND_pairs p,ND *nf); |
int nd_sp(int mod,int trace,ND_pairs p,ND *nf); |
int nd_nf(int mod,ND g,NDV *ps,int full,ND *nf); |
int nd_nf(int mod,ND g,NDV *ps,int full,NDC dn,ND *nf); |
int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *nf); |
int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *nf); |
int nd_nf_direct(int mod,ND g,BaseSet base,int full,ND *rp); |
|
|
|
/* finalizers */ |
/* finalizers */ |
NODE ndv_reducebase(NODE x); |
NODE ndv_reducebase(NODE x); |
Line 311 void ndp_print(ND_pairs d); |
|
Line 308 void ndp_print(ND_pairs d); |
|
/* setup, reconstruct */ |
/* setup, reconstruct */ |
void nd_init_ord(struct order_spec *spec); |
void nd_init_ord(struct order_spec *spec); |
ND_pairs nd_reconstruct(int mod,int trace,ND_pairs ndp); |
ND_pairs nd_reconstruct(int mod,int trace,ND_pairs ndp); |
void nd_reconstruct_direct(int mod,NDV *ps,int len); |
|
void ndv_setup(int mod,int trace,NODE f); |
void ndv_setup(int mod,int trace,NODE f); |
void nd_setup_parameters(int nvar,int max); |
void nd_setup_parameters(int nvar,int max); |
BlockMask nd_create_blockmask(struct order_spec *ord); |
BlockMask nd_create_blockmask(struct order_spec *ord); |
Line 327 void nd_mul_c(int mod,ND p,int mul); |
|
Line 323 void nd_mul_c(int mod,ND p,int mul); |
|
void nd_mul_c_q(ND p,Q mul); |
void nd_mul_c_q(ND p,Q mul); |
void nd_mul_c_p(VL vl,ND p,P mul); |
void nd_mul_c_p(VL vl,ND p,P mul); |
ND nd_remove_head(ND p); |
ND nd_remove_head(ND p); |
|
ND nd_separate_head(ND p,ND *head); |
int nd_length(ND p); |
int nd_length(ND p); |
void nd_append_red(UINT *d,int i); |
void nd_append_red(UINT *d,int i); |
UINT *ndv_compute_bound(NDV p); |
UINT *ndv_compute_bound(NDV p); |
Line 1048 int ndl_check_bound2(int index,UINT *d2) |
|
Line 1045 int ndl_check_bound2(int index,UINT *d2) |
|
#endif |
#endif |
} |
} |
|
|
int ndl_check_bound2_direct(UINT *d1,UINT *d2) |
|
{ |
|
UINT u2; |
|
int i,j,ind,k; |
|
|
|
ind = 0; |
|
#if USE_UNROLL |
|
switch ( nd_bpe ) { |
|
case 3: |
|
for ( i = nd_exporigin; i < nd_wpd; i++ ) { |
|
u2 = d2[i]; |
|
if ( d1[ind++]+((u2>>27)&0x7) >= 0x8 ) return 1; |
|
if ( d1[ind++]+((u2>>24)&0x7) >= 0x8 ) return 1; |
|
if ( d1[ind++]+((u2>>21)&0x7) >= 0x8 ) return 1; |
|
if ( d1[ind++]+((u2>>18)&0x7) >= 0x8 ) return 1; |
|
if ( d1[ind++]+((u2>>15)&0x7) >= 0x8 ) return 1; |
|
if ( d1[ind++]+((u2>>12)&0x7) >= 0x8 ) return 1; |
|
if ( d1[ind++]+((u2>>9)&0x7) >= 0x8 ) return 1; |
|
if ( d1[ind++]+((u2>>6)&0x7) >= 0x8 ) return 1; |
|
if ( d1[ind++]+((u2>>3)&0x7) >= 0x8 ) return 1; |
|
if ( d1[ind++]+(u2&0x7) >= 0x8 ) return 1; |
|
} |
|
return 0; |
|
break; |
|
case 4: |
|
for ( i = nd_exporigin; i < nd_wpd; i++ ) { |
|
u2 = d2[i]; |
|
if ( d1[ind++]+((u2>>28)&0xf) >= 0x10 ) return 1; |
|
if ( d1[ind++]+((u2>>24)&0xf) >= 0x10 ) return 1; |
|
if ( d1[ind++]+((u2>>20)&0xf) >= 0x10 ) return 1; |
|
if ( d1[ind++]+((u2>>16)&0xf) >= 0x10 ) return 1; |
|
if ( d1[ind++]+((u2>>12)&0xf) >= 0x10 ) return 1; |
|
if ( d1[ind++]+((u2>>8)&0xf) >= 0x10 ) return 1; |
|
if ( d1[ind++]+((u2>>4)&0xf) >= 0x10 ) return 1; |
|
if ( d1[ind++]+(u2&0xf) >= 0x10 ) return 1; |
|
} |
|
return 0; |
|
break; |
|
case 6: |
|
for ( i = nd_exporigin; i < nd_wpd; i++ ) { |
|
u2 = d2[i]; |
|
if ( d1[ind++]+((u2>>24)&0x3f) >= 0x40 ) return 1; |
|
if ( d1[ind++]+((u2>>18)&0x3f) >= 0x40 ) return 1; |
|
if ( d1[ind++]+((u2>>12)&0x3f) >= 0x40 ) return 1; |
|
if ( d1[ind++]+((u2>>6)&0x3f) >= 0x40 ) return 1; |
|
if ( d1[ind++]+(u2&0x3f) >= 0x40 ) return 1; |
|
} |
|
return 0; |
|
break; |
|
case 8: |
|
for ( i = nd_exporigin; i < nd_wpd; i++ ) { |
|
u2 = d2[i]; |
|
if ( d1[ind++]+((u2>>24)&0xff) >= 0x100 ) return 1; |
|
if ( d1[ind++]+((u2>>16)&0xff) >= 0x100 ) return 1; |
|
if ( d1[ind++]+((u2>>8)&0xff) >= 0x100 ) return 1; |
|
if ( d1[ind++]+(u2&0xff) >= 0x100 ) return 1; |
|
} |
|
return 0; |
|
break; |
|
case 16: |
|
for ( i = nd_exporigin; i < nd_wpd; i++ ) { |
|
u2 = d2[i]; |
|
if ( d1[ind++]+((u2>>16)&0xffff) > 0x10000 ) return 1; |
|
if ( d1[ind++]+(u2&0xffff) > 0x10000 ) return 1; |
|
} |
|
return 0; |
|
break; |
|
case 32: |
|
for ( i = nd_exporigin; i < nd_wpd; i++ ) |
|
if ( d1[i]+d2[i]<d1[i] ) return 1; |
|
return 0; |
|
break; |
|
default: |
|
for ( i = nd_exporigin; i < nd_wpd; i++ ) { |
|
u2 = d2[i]; |
|
k = (nd_epw-1)*nd_bpe; |
|
for ( j = 0; j < nd_epw; j++, k -= nd_bpe ) |
|
if ( d1[ind++]+((u2>>k)&nd_mask0) > nd_mask0 ) return 1; |
|
} |
|
return 0; |
|
break; |
|
} |
|
#else |
|
for ( i = nd_exporigin; i < nd_wpd; i++ ) { |
|
u2 = d2[i]; |
|
k = (nd_epw-1)*nd_bpe; |
|
for ( j = 0; j < nd_epw; j++, k -= nd_bpe ) |
|
if ( d1[ind++]+((u2>>k)&nd_mask0) > nd_mask0 ) return 1; |
|
} |
|
return 0; |
|
#endif |
|
} |
|
|
|
INLINE int ndl_hash_value(UINT *d) |
INLINE int ndl_hash_value(UINT *d) |
{ |
{ |
int i; |
int i; |
Line 1186 INLINE int ndl_find_reducer(UINT *dg) |
|
Line 1090 INLINE int ndl_find_reducer(UINT *dg) |
|
return -1; |
return -1; |
} |
} |
|
|
INLINE int ndl_find_reducer_direct(UINT *dg,NDV *ps,int len) |
|
{ |
|
NDV r; |
|
RHist s; |
|
int d,k,i; |
|
|
|
if ( Reverse ) |
|
for ( i = len-1; i >= 0; i-- ) { |
|
r = ps[i]; |
|
if ( ndl_reducible(dg,HDL(r)) ) |
|
return i; |
|
} |
|
else |
|
for ( i = 0; i < len; i++ ) { |
|
r = ps[i]; |
|
if ( ndl_reducible(dg,HDL(r)) ) |
|
return i; |
|
} |
|
return -1; |
|
} |
|
|
|
ND nd_merge(ND p1,ND p2) |
ND nd_merge(ND p1,ND p2) |
{ |
{ |
int n,c; |
int n,c; |
Line 1346 ND nd_add_q(ND p1,ND p2) |
|
Line 1229 ND nd_add_q(ND p1,ND p2) |
|
} |
} |
|
|
/* ret=1 : success, ret=0 : overflow */ |
/* ret=1 : success, ret=0 : overflow */ |
int nd_nf(int mod,ND g,NDV *ps,int full,ND *rp) |
int nd_nf(int mod,ND g,NDV *ps,int full,NDC dn,ND *rp) |
{ |
{ |
ND d; |
ND d; |
NM m,mrd,tail; |
NM m,mrd,tail; |
Line 1355 int nd_nf(int mod,ND g,NDV *ps,int full,ND *rp) |
|
Line 1238 int nd_nf(int mod,ND g,NDV *ps,int full,ND *rp) |
|
int c,c1,c2,dummy; |
int c,c1,c2,dummy; |
RHist h; |
RHist h; |
NDV p,red; |
NDV p,red; |
Q cg,cred,gcd; |
Q cg,cred,gcd,tq,qq; |
double hmag; |
double hmag; |
|
|
|
if ( dn ) { |
|
if ( mod ) |
|
dn->m = 1; |
|
else |
|
dn->z = ONE; |
|
} |
if ( !g ) { |
if ( !g ) { |
*rp = 0; |
*rp = 0; |
return 1; |
return 1; |
Line 1384 int nd_nf(int mod,ND g,NDV *ps,int full,ND *rp) |
|
Line 1273 int nd_nf(int mod,ND g,NDV *ps,int full,ND *rp) |
|
igcd_cofactor(HCQ(g),HCQ(p),&gcd,&cg,&cred); |
igcd_cofactor(HCQ(g),HCQ(p),&gcd,&cg,&cred); |
chsgnq(cg,&CQ(mul)); |
chsgnq(cg,&CQ(mul)); |
nd_mul_c_q(d,cred); nd_mul_c_q(g,cred); |
nd_mul_c_q(d,cred); nd_mul_c_q(g,cred); |
|
if ( dn ) { |
|
mulq(dn->z,cred,&tq); dn->z = tq; |
|
} |
} |
} |
g = nd_add(mod,g,ndv_mul_nm(mod,mul,p)); |
g = nd_add(mod,g,ndv_mul_nm(mod,mul,p)); |
sugar = MAX(sugar,SG(p)+TD(DL(mul))); |
sugar = MAX(sugar,SG(p)+TD(DL(mul))); |
if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) { |
if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) { |
|
tq = HCQ(g); |
nd_removecont2(d,g); |
nd_removecont2(d,g); |
|
if ( dn ) { |
|
divq(tq,HCQ(g),&qq); divq(dn->z,qq,&tq); dn->z = tq; |
|
} |
hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; |
hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; |
} |
} |
} else if ( !full ) { |
} else if ( !full ) { |
Line 1508 int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp |
|
Line 1404 int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp |
|
} |
} |
} |
} |
|
|
int nd_nf_direct(int mod,ND g,BaseSet base,int full,ND *rp) |
|
{ |
|
ND d; |
|
NM m,mrd,tail; |
|
NM mul; |
|
NDV *ps; |
|
int n,sugar,psugar,sugar0,stat,index,len; |
|
int c,c1,c2; |
|
UINT **bound; |
|
RHist h; |
|
NDV p,red; |
|
Q cg,cred,gcd; |
|
double hmag; |
|
|
|
if ( !g ) { |
|
*rp = 0; |
|
return 1; |
|
} |
|
#if 0 |
|
if ( !mod ) |
|
hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; |
|
#else |
|
/* XXX */ |
|
hmag = 0; |
|
#endif |
|
|
|
ps = base->ps; |
|
bound = base->bound; |
|
len = base->len; |
|
sugar0 = sugar = SG(g); |
|
n = NV(g); |
|
mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(UINT)); |
|
for ( d = 0; g; ) { |
|
index = ndl_find_reducer_direct(HDL(g),ps,len); |
|
if ( index >= 0 ) { |
|
p = ps[index]; |
|
ndl_sub(HDL(g),HDL(p),DL(mul)); |
|
if ( ndl_check_bound2_direct(bound[index],DL(mul)) ) { |
|
nd_free(g); nd_free(d); |
|
return 0; |
|
} |
|
if ( mod ) { |
|
c1 = invm(HCM(p),mod); c2 = mod-HCM(g); |
|
DMAR(c1,c2,0,mod,c); CM(mul) = c; |
|
} else { |
|
igcd_cofactor(HCQ(g),HCQ(p),&gcd,&cg,&cred); |
|
chsgnq(cg,&CQ(mul)); |
|
nd_mul_c_q(d,cred); nd_mul_c_q(g,cred); |
|
} |
|
g = nd_add(mod,g,ndv_mul_nm(mod,mul,p)); |
|
sugar = MAX(sugar,SG(p)+TD(DL(mul))); |
|
if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) { |
|
nd_removecont2(d,g); |
|
hmag = ((double)p_mag((P)HCQ(g)))*nd_scale; |
|
} |
|
} else if ( !full ) { |
|
*rp = g; |
|
return 1; |
|
} else { |
|
m = BDY(g); |
|
if ( NEXT(m) ) { |
|
BDY(g) = NEXT(m); NEXT(m) = 0; LEN(g)--; |
|
} else { |
|
FREEND(g); g = 0; |
|
} |
|
if ( d ) { |
|
NEXT(tail)=m; tail=m; LEN(d)++; |
|
} else { |
|
MKND(n,m,1,d); tail = BDY(d); |
|
} |
|
} |
|
} |
|
if ( d ) SG(d) = sugar; |
|
*rp = d; |
|
return 1; |
|
} |
|
|
|
/* 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_candidate(NODE input,int obpe,int oadv,EPOS oepos,NODE cand) |
Line 1593 int ndv_check_candidate(NODE input,int obpe,int oadv,E |
|
Line 1412 int ndv_check_candidate(NODE input,int obpe,int oadv,E |
|
ND nf,d; |
ND nf,d; |
NDV r; |
NDV r; |
NODE t,s; |
NODE t,s; |
|
union oNDC dn; |
|
|
ndv_setup(0,0,cand); |
ndv_setup(0,0,cand); |
n = length(cand); |
n = length(cand); |
|
|
else |
else |
r = (NDV)BDY(t); |
r = (NDV)BDY(t); |
d = ndvtond(0,r); |
d = ndvtond(0,r); |
stat = nd_nf(0,d,nd_ps,0,&nf); |
stat = nd_nf(0,d,nd_ps,0,0,&nf); |
if ( !stat ) { |
if ( !stat ) { |
nd_reconstruct(0,0,0); |
nd_reconstruct(0,0,0); |
goto again; |
goto again; |
Line 1633 ND nd_remove_head(ND p) |
|
Line 1453 ND nd_remove_head(ND p) |
|
return p; |
return p; |
} |
} |
|
|
|
ND nd_separate_head(ND p,ND *head) |
|
{ |
|
NM m,m0; |
|
ND r; |
|
|
|
m = BDY(p); |
|
if ( !NEXT(m) ) { |
|
*head = p; p = 0; |
|
} else { |
|
m0 = m; |
|
BDY(p) = NEXT(m); LEN(p)--; |
|
NEXT(m0) = 0; |
|
MKND(NV(p),m0,1,r); |
|
*head = r; |
|
} |
|
return p; |
|
} |
|
|
PGeoBucket create_pbucket() |
PGeoBucket create_pbucket() |
{ |
{ |
PGeoBucket g; |
PGeoBucket g; |
Line 1835 NODE nd_gb(int m,int checkonly) |
|
Line 1673 NODE nd_gb(int m,int checkonly) |
|
ND_pairs l; |
ND_pairs l; |
ND h,nf; |
ND h,nf; |
NDV nfv; |
NDV nfv; |
|
union oNDC dn; |
|
|
g = 0; d = 0; |
g = 0; d = 0; |
for ( i = 0; i < nd_psn; i++ ) { |
for ( i = 0; i < nd_psn; i++ ) { |
|
|
goto again; |
goto again; |
} |
} |
#if USE_GEOBUCKET |
#if USE_GEOBUCKET |
stat = m?nd_nf_pbucket(m,h,nd_ps,!Top,&nf):nd_nf(m,h,nd_ps,!Top,&nf); |
stat = m?nd_nf_pbucket(m,h,nd_ps,!Top,&nf):nd_nf(m,h,nd_ps,!Top,0,&nf); |
#else |
#else |
stat = nd_nf(m,h,nd_ps,!Top,&nf); |
stat = nd_nf(m,h,nd_ps,!Top,0,&nf); |
#endif |
#endif |
if ( !stat ) { |
if ( !stat ) { |
NEXT(l) = d; d = l; |
NEXT(l) = d; d = l; |
Line 1890 NODE nd_gb_trace(int m) |
|
Line 1729 NODE nd_gb_trace(int m) |
|
ND_pairs l; |
ND_pairs l; |
ND h,nf,nfq; |
ND h,nf,nfq; |
NDV nfv,nfqv; |
NDV nfv,nfqv; |
|
union oNDC dn; |
|
|
g = 0; d = 0; |
g = 0; d = 0; |
for ( i = 0; i < nd_psn; i++ ) { |
for ( i = 0; i < nd_psn; i++ ) { |
|
|
#if USE_GEOBUCKET |
#if USE_GEOBUCKET |
stat = nd_nf_pbucket(m,h,nd_ps,!Top,&nf); |
stat = nd_nf_pbucket(m,h,nd_ps,!Top,&nf); |
#else |
#else |
stat = nd_nf(m,h,nd_ps,!Top,&nf); |
stat = nd_nf(m,h,nd_ps,!Top,0,&nf); |
#endif |
#endif |
if ( !stat ) { |
if ( !stat ) { |
NEXT(l) = d; d = l; |
NEXT(l) = d; d = l; |
|
|
} else if ( nf ) { |
} else if ( nf ) { |
/* overflow does not occur */ |
/* overflow does not occur */ |
nd_sp(0,1,l,&h); |
nd_sp(0,1,l,&h); |
nd_nf(0,h,nd_ps_trace,!Top,&nfq); |
nd_nf(0,h,nd_ps_trace,!Top,0,&nfq); |
if ( nfq ) { |
if ( nfq ) { |
/* failure; m|HC(nfq) */ |
/* failure; m|HC(nfq) */ |
if ( !rem(NM(HCQ(nfq)),m) ) return 0; |
if ( !rem(NM(HCQ(nfq)),m) ) return 0; |
Line 1958 int ndv_compare_rev(NDV *p1,NDV *p2) |
|
Line 1798 int ndv_compare_rev(NDV *p1,NDV *p2) |
|
|
|
NODE ndv_reduceall(int m,NODE f) |
NODE ndv_reduceall(int m,NODE f) |
{ |
{ |
int i,j,n,stat; |
int i,n,stat; |
NDV *w,*ps; |
ND nf,g,head; |
ND nf,g; |
|
NODE t,a0,a; |
NODE t,a0,a; |
struct oBaseSet base; |
union oNDC dn; |
UINT **bound; |
NDV *w; |
|
Q q; |
|
|
for ( n = 0, t = f; t; t = NEXT(t), n++ ); |
n = length(f); |
ps = (NDV *)ALLOCA(n*sizeof(NDV)); |
#if 0 |
bound = (UINT **)ALLOCA(n*sizeof(UINT *)); |
w = (NDV *)ALLOCA(n*sizeof(NDV)); |
for ( i = 0, t = f; i < n; i++, t = NEXT(t) ) ps[i] = (NDV)BDY(t); |
for ( i = 0, t = f; i < n; i++, t = NEXT(t) ) w[i] = (NDV)BDY(t); |
qsort(ps,n,sizeof(NDV),(int (*)(const void *,const void *))ndv_compare); |
qsort(w,n,sizeof(NDV), |
for ( i = 0; i < n; i++ ) bound[i] = ndv_compute_bound(ps[i]); |
(int (*)(const void *,const void *))ndv_compare); |
base.ps = (NDV *)ALLOCA((n-1)*sizeof(NDV)); |
for ( t = f, i = 0; t; i++, t = NEXT(t) ) BDY(t) = (pointer)w[i]; |
base.bound = (UINT **)ALLOCA((n-1)*sizeof(UINT *)); |
#endif |
base.len = n-1; |
ndv_setup(m,0,f); |
i = 0; |
for ( i = 0; i < n; ) { |
while ( i < n ) { |
g = ndvtond(m,nd_ps[i]); |
for ( j = 0; j < i; j++ ) { |
g = nd_separate_head(g,&head); |
base.ps[j] = ps[j]; base.bound[j] = bound[j]; |
stat = nd_nf(m,g,nd_ps,1,&dn,&nf); |
} |
|
for ( j = i+1; j < n; j++ ) { |
|
base.ps[j-1] = ps[j]; base.bound[j-1] = bound[j]; |
|
} |
|
g = ndvtond(m,ps[i]); |
|
stat = nd_nf_direct(m,g,&base,1,&nf); |
|
if ( !stat ) |
if ( !stat ) |
nd_reconstruct_direct(m,ps,n); |
nd_reconstruct(m,0,0); |
else if ( !nf ) { |
else { |
printf("."); fflush(stdout); |
printf("."); fflush(stdout); |
ndv_free(ps[i]); |
if ( !m ) { mulq(HCQ(head),dn.z,&q); HCQ(head) = q; } |
for ( j = i+1; j < n; j++ ) { |
nf = nd_add(m,head,nf); |
ps[j-1] = ps[j]; bound[j-1] = bound[j]; |
ndv_free(nd_ps[i]); |
} |
|
n--; |
|
base.len = n-1; |
|
} else { |
|
printf("."); fflush(stdout); |
|
ndv_free(ps[i]); |
|
nd_removecont(m,nf); |
nd_removecont(m,nf); |
ps[i] = ndtondv(m,nf); |
nd_ps[i] = ndtondv(m,nf); nd_free(nf); |
bound[i] = ndv_compute_bound(ps[i]); |
nd_bound[i] = ndv_compute_bound(nd_ps[i]); |
nd_free(nf); |
|
i++; |
i++; |
} |
} |
} |
} |
printf("\n"); |
printf("\n"); |
for ( a0 = 0, i = 0; i < n; i++ ) { |
for ( a0 = 0, i = 0; i < n; i++ ) { |
NEXTNODE(a0,a); |
NEXTNODE(a0,a); |
BDY(a) = (pointer)ps[i]; |
BDY(a) = (pointer)nd_ps[i]; |
} |
} |
NEXT(a) = 0; |
NEXT(a) = 0; |
return a0; |
return a0; |
Line 2253 ND_pairs nd_minp( ND_pairs d, ND_pairs *prest ) |
|
Line 2080 ND_pairs nd_minp( ND_pairs d, ND_pairs *prest ) |
|
|
|
ND_pairs nd_minsugarp( ND_pairs d, ND_pairs *prest ) |
ND_pairs nd_minsugarp( ND_pairs d, ND_pairs *prest ) |
{ |
{ |
int msugar; |
int msugar,i; |
ND_pairs t,dm0,dm,dr0,dr; |
ND_pairs t,dm0,dm,dr0,dr; |
|
|
for ( msugar = SG(d), t = NEXT(d); t; t = NEXT(t) ) |
for ( msugar = SG(d), t = NEXT(d); t; t = NEXT(t) ) |
if ( SG(t) < msugar ) msugar = SG(t); |
if ( SG(t) < msugar ) msugar = SG(t); |
dm0 = 0; dr0 = 0; |
dm0 = 0; dr0 = 0; |
for ( t = d; t; t = NEXT(t) ) |
for ( i = 0, t = d; t; t = NEXT(t) ) |
if ( SG(t) == msugar ) { |
if ( i < nd_f4_nsp && SG(t) == msugar ) { |
if ( dm0 ) NEXT(dm) = t; |
if ( dm0 ) NEXT(dm) = t; |
else dm0 = t; |
else dm0 = t; |
dm = t; |
dm = t; |
|
i++; |
} else { |
} else { |
if ( dr0 ) NEXT(dr) = t; |
if ( dr0 ) NEXT(dr) = t; |
else dr0 = t; |
else dr0 = t; |
Line 2308 void ndv_setup(int mod,int trace,NODE f) |
|
Line 2136 void ndv_setup(int mod,int trace,NODE f) |
|
NODE s,s0,f0; |
NODE s,s0,f0; |
UINT *d; |
UINT *d; |
RHist r; |
RHist r; |
|
NDV *w; |
NDV a,am; |
NDV a,am; |
|
|
nd_found = 0; nd_notfirst = 0; nd_create = 0; |
nd_found = 0; nd_notfirst = 0; nd_create = 0; |
|
|
nd_psn = length(f); nd_pslen = 2*nd_psn; |
for ( nd_psn = 0, s = f; s; s = NEXT(s) ) if ( BDY(s) ) nd_psn++; |
|
w = (NDV *)ALLOCA(nd_psn*sizeof(NDV)); |
|
for ( i = 0, s = f; s; s = NEXT(s) ) if ( BDY(s) ) w[i++] = BDY(s); |
|
qsort(w,nd_psn,sizeof(NDV), |
|
(int (*)(const void *,const void *))ndv_compare); |
|
nd_pslen = 2*nd_psn; |
nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV)); |
nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV)); |
nd_ps_trace = (NDV *)MALLOC(nd_pslen*sizeof(NDV)); |
nd_ps_trace = (NDV *)MALLOC(nd_pslen*sizeof(NDV)); |
nd_psh = (RHist *)MALLOC(nd_pslen*sizeof(RHist)); |
nd_psh = (RHist *)MALLOC(nd_pslen*sizeof(RHist)); |
Line 2322 void ndv_setup(int mod,int trace,NODE f) |
|
Line 2156 void ndv_setup(int mod,int trace,NODE f) |
|
nd_red = (RHist *)MALLOC(REDTAB_LEN*sizeof(RHist)); |
nd_red = (RHist *)MALLOC(REDTAB_LEN*sizeof(RHist)); |
bzero(nd_red,REDTAB_LEN*sizeof(RHist)); |
bzero(nd_red,REDTAB_LEN*sizeof(RHist)); |
nd_free_private_storage(); |
nd_free_private_storage(); |
for ( i = 0; i < nd_psn; i++, f = NEXT(f) ) { |
for ( i = 0; i < nd_psn; i++ ) { |
if ( trace ) { |
if ( trace ) { |
a = nd_ps_trace[i] = ndv_dup(0,(NDV)BDY(f)); |
a = nd_ps_trace[i] = ndv_dup(0,w[i]); |
ndv_removecont(0,a); |
ndv_removecont(0,a); |
am = nd_ps[i] = ndv_dup(mod,a); |
am = nd_ps[i] = ndv_dup(mod,a); |
ndv_mod(mod,am); |
ndv_mod(mod,am); |
ndv_removecont(mod,am); |
ndv_removecont(mod,am); |
} else { |
} else { |
a = nd_ps[i] = ndv_dup(mod,(NDV)BDY(f)); |
a = nd_ps[i] = ndv_dup(mod,w[i]); |
if ( mod ) ndv_mod(mod,a); |
|
ndv_removecont(mod,a); |
ndv_removecont(mod,a); |
} |
} |
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 2345 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2178 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
VL tv,fv,vv,vc; |
VL tv,fv,vv,vc; |
NODE fd,fd0,r,r0,t,x,s,xx; |
NODE fd,fd0,r,r0,t,x,s,xx; |
int e,max,nvar; |
int e,max,nvar; |
ND b; |
NDV b; |
|
|
get_vars((Obj)f,&fv); pltovl(v,&vv); |
get_vars((Obj)f,&fv); pltovl(v,&vv); |
nvar = length(vv); |
nvar = length(vv); |
Line 2358 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
Line 2191 void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe |
|
nd_setup_parameters(nvar,max); |
nd_setup_parameters(nvar,max); |
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
b = (pointer)ptondv(CO,vv,(P)BDY(t)); |
b = (pointer)ptondv(CO,vv,(P)BDY(t)); |
|
if ( m ) ndv_mod(m,b); |
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; |
Line 2953 ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) |
|
Line 2787 ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) |
|
return s0; |
return s0; |
} |
} |
|
|
void nd_reconstruct_direct(int mod,NDV *ps,int len) |
|
{ |
|
int i,obpe,oadv,h; |
|
UINT **bound; |
|
NM prev_nm_free_list; |
|
RHist mr0,mr; |
|
RHist r; |
|
RHist *old_red; |
|
ND_pairs s0,s,t,prev_ndp_free_list; |
|
EPOS oepos; |
|
|
|
obpe = nd_bpe; |
|
oadv = nmv_adv; |
|
oepos = nd_epos; |
|
if ( obpe < 2 ) nd_bpe = 2; |
|
else if ( obpe < 3 ) nd_bpe = 3; |
|
else if ( obpe < 4 ) nd_bpe = 4; |
|
else if ( obpe < 5 ) nd_bpe = 5; |
|
else if ( obpe < 6 ) nd_bpe = 6; |
|
else if ( obpe < 8 ) nd_bpe = 8; |
|
else if ( obpe < 10 ) nd_bpe = 10; |
|
else if ( obpe < 16 ) nd_bpe = 16; |
|
else if ( obpe < 32 ) nd_bpe = 32; |
|
else error("nd_reconstruct_direct : exponent too large"); |
|
|
|
nd_setup_parameters(0,0); |
|
prev_nm_free_list = _nm_free_list; |
|
prev_ndp_free_list = _ndp_free_list; |
|
_nm_free_list = 0; _ndp_free_list = 0; |
|
for ( i = len-1; i >= 0; i-- ) ndv_realloc(ps[i],obpe,oadv,oepos); |
|
prev_nm_free_list = 0; |
|
prev_ndp_free_list = 0; |
|
GC_gcollect(); |
|
} |
|
|
|
void ndl_reconstruct(UINT *d,UINT *r,int obpe,EPOS oepos) |
void ndl_reconstruct(UINT *d,UINT *r,int obpe,EPOS oepos) |
{ |
{ |
int n,i,ei,oepw,omask0,j,s,ord_l,l; |
int n,i,ei,oepw,omask0,j,s,ord_l,l; |
Line 3715 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
Line 3514 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
NDV ndv; |
NDV ndv; |
VL vv,tv; |
VL vv,tv; |
int stat,nvar,max,e; |
int stat,nvar,max,e; |
|
union oNDC dn; |
|
|
pltovl(v,&vv); |
pltovl(v,&vv); |
nvar = length(vv); |
nvar = length(vv); |
Line 3737 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
Line 3537 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
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); |
BDY(in) = (pointer)ptondv(CO,vv,(P)BDY(t)); |
BDY(in) = (pointer)ptondv(CO,vv,(P)BDY(t)); |
|
if ( m ) ndv_mod(m,(NDV)BDY(in)); |
} |
} |
NEXTNODE(in0,in); |
NEXTNODE(in0,in); |
BDY(in) = (pointer)ptondv(CO,vv,f); |
BDY(in) = (pointer)ptondv(CO,vv,f); |
|
if ( m ) ndv_mod(m,(NDV)BDY(in)); |
NEXT(in) = 0; |
NEXT(in) = 0; |
|
|
ndv_setup(m,0,in0); |
ndv_setup(m,0,in0); |
Line 3747 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
Line 3549 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec |
|
nd_scale=2; |
nd_scale=2; |
while ( 1 ) { |
while ( 1 ) { |
nd = (pointer)ndvtond(m,nd_ps[nd_psn]); |
nd = (pointer)ndvtond(m,nd_ps[nd_psn]); |
stat = nd_nf(m,nd,nd_ps,1,&nf); |
stat = nd_nf(m,nd,nd_ps,1,0,&nf); |
if ( !stat ) { |
if ( !stat ) { |
nd_psn++; |
nd_psn++; |
nd_reconstruct(m,0,0); |
nd_reconstruct(m,0,0); |
Line 3928 NDV vect_to_ndv(UINT *vect,int spcol,int col,int *rhea |
|
Line 3730 NDV vect_to_ndv(UINT *vect,int spcol,int col,int *rhea |
|
} |
} |
} |
} |
|
|
NODE nd_sp_f4(int m,ND_pairs l,PGeoBucket bucket) |
int nd_sp_f4(int m,ND_pairs l,PGeoBucket bucket,NODE *s) |
{ |
{ |
ND_pairs t; |
ND_pairs t; |
NODE sp0,sp; |
NODE sp0,sp; |
Line 3944 NODE nd_sp_f4(int m,ND_pairs l,PGeoBucket bucket) |
|
Line 3746 NODE nd_sp_f4(int m,ND_pairs l,PGeoBucket bucket) |
|
add_pbucket_symbolic(bucket,spol); |
add_pbucket_symbolic(bucket,spol); |
} |
} |
} |
} |
return sp0; |
*s = sp0; |
|
return 1; |
} |
} |
|
|
int nd_symbolic_preproc(PGeoBucket bucket,UINT **s0vect,NODE *r) |
int nd_symbolic_preproc(PGeoBucket bucket,UINT **s0vect,NODE *r) |
Line 3986 int nd_symbolic_preproc(PGeoBucket bucket,UINT **s0vec |
|
Line 3789 int nd_symbolic_preproc(PGeoBucket bucket,UINT **s0vec |
|
return col; |
return col; |
} |
} |
|
|
|
#if 0 |
NODE nd_f4(int m) |
NODE nd_f4(int m) |
{ |
{ |
int i,nh,stat,index; |
int i,nh,stat,index; |
Line 3997 NODE nd_f4(int m) |
|
Line 3801 NODE nd_f4(int m) |
|
NODE sp0,sp,rp0,rp; |
NODE sp0,sp,rp0,rp; |
int nsp,nred,col,rank,len,k,j,a; |
int nsp,nred,col,rank,len,k,j,a; |
UINT c; |
UINT c; |
|
UINT *s0vect,*svect,*p,*v; |
|
int *colstat; |
|
IndArray *imat; |
|
int *rhead; |
|
int spcol,sprow; |
|
int sugar; |
|
PGeoBucket bucket; |
|
struct oEGT eg0,eg1,eg_f4; |
|
static UINT **spmat; |
|
static UINT *spb; |
|
static int spblen; |
|
|
|
if ( !m ) |
|
error("nd_f4 : not implemented"); |
|
|
|
g = 0; d = 0; |
|
for ( i = 0; i < nd_psn; i++ ) { |
|
d = update_pairs(d,g,i); |
|
g = update_base(g,i); |
|
} |
|
if ( !spmat ) { |
|
spmat = (UINT **)MALLOC(nd_f4_nsp*sizeof(UINT *)); |
|
spblen = 10000; |
|
spb = (UINT *)MALLOC_ATOMIC(nd_f4_nsp*spblen*sizeof(UINT)); |
|
} |
|
while ( d ) { |
|
get_eg(&eg0); |
|
l = nd_minsugarp(d,&d); |
|
sugar = SG(l); |
|
bucket = create_pbucket(); |
|
stat = nd_sp_f4(m,l,bucket,&sp0); |
|
if ( !stat ) { |
|
for ( t = l; NEXT(t); t = NEXT(t) ); |
|
NEXT(t) = d; d = l; |
|
d = nd_reconstruct(m,0,d); |
|
continue; |
|
} |
|
if ( !sp0 ) continue; |
|
col = nd_symbolic_preproc(bucket,&s0vect,&rp0); |
|
if ( !col ) { |
|
for ( t = l; NEXT(t); t = NEXT(t) ); |
|
NEXT(t) = d; d = l; |
|
d = nd_reconstruct(m,0,d); |
|
continue; |
|
} |
|
|
|
nsp = length(sp0); nred = length(rp0); spcol = col-nred; |
|
imat = (IndArray *)MALLOC(nred*sizeof(IndArray)); |
|
rhead = (int *)MALLOC_ATOMIC(col*sizeof(int)); |
|
for ( i = 0; i < col; i++ ) rhead[i] = 0; |
|
|
|
/* construction of index arrays */ |
|
for ( rp = rp0, i = 0; rp; i++, rp = NEXT(rp) ) { |
|
imat[i] = nm_ind_pair_to_vect_compress(m,s0vect,col,(NM_ind_pair)BDY(rp)); |
|
rhead[imat[i]->head] = 1; |
|
} |
|
|
|
/* elimination (1st step) */ |
|
svect = (UINT *)MALLOC_ATOMIC(col*sizeof(UINT)); |
|
if ( spcol > spblen ) { |
|
spblen = spcol; |
|
spb = REALLOC(spb,spblen*nd_f4_nsp*sizeof(UINT)); |
|
} |
|
|
|
for ( a = sprow = 0, sp = sp0, p = spb; a < nsp; a++, sp = NEXT(sp) ) { |
|
nd_to_vect(m,s0vect,col,BDY(sp),svect); |
|
ndv_reduce_vect(m,svect,col,imat,rp0); |
|
for ( i = 0; i < col; i++ ) if ( svect[i] ) break; |
|
if ( i < col ) { |
|
spmat[sprow] = p; |
|
v = spmat[sprow]; |
|
for ( j = k = 0; j < col; j++ ) |
|
if ( !rhead[j] ) v[k++] = svect[j]; |
|
sprow++; |
|
p += k; |
|
} |
|
} |
|
/* free index arrays */ |
|
for ( i = 0; i < nred; i++ ) GC_free(imat[i]->index.c); |
|
|
|
/* elimination (2nd step) */ |
|
colstat = (int *)ALLOCA(spcol*sizeof(int)); |
|
rank = generic_gauss_elim_mod(spmat,sprow,spcol,m,colstat); |
|
|
|
get_eg(&eg1); init_eg(&eg_f4); add_eg(&eg_f4,&eg0,&eg1); |
|
fprintf(asir_out,"sugar=%d,nsp=%d,nred=%d,spmat=(%d,%d),rank=%d ", |
|
sugar,nsp,nred,sprow,spcol,rank); |
|
fprintf(asir_out,"%fsec\n",eg_f4.exectime+eg_f4.gctime); |
|
|
|
/* adding new bases */ |
|
for ( i = 0; i < rank; i++ ) { |
|
nf = vect_to_ndv(spmat[i],spcol,col,rhead,s0vect); |
|
SG(nf) = sugar; |
|
ndv_removecont(m,nf); |
|
nh = ndv_newps(nf,0); |
|
d = update_pairs(d,g,nh); |
|
g = update_base(g,nh); |
|
} |
|
} |
|
for ( r = g; r; r = NEXT(r) ) BDY(r) = (pointer)nd_ps[(int)BDY(r)]; |
|
return g; |
|
} |
|
#else |
|
NODE nd_f4(int m) |
|
{ |
|
int i,nh,stat,index; |
|
NODE r,g; |
|
ND_pairs d,l,t; |
|
ND spol,red; |
|
NDV nf,redv; |
|
NM s0,s; |
|
NODE sp0,sp,rp0,rp; |
|
int nsp,nred,col,rank,len,k,j,a; |
|
UINT c; |
UINT **spmat; |
UINT **spmat; |
UINT *s0vect,*svect,*p,*v; |
UINT *s0vect,*svect,*p,*v; |
int *colstat; |
int *colstat; |
Line 4020 NODE nd_f4(int m) |
|
Line 3938 NODE nd_f4(int m) |
|
l = nd_minsugarp(d,&d); |
l = nd_minsugarp(d,&d); |
sugar = SG(l); |
sugar = SG(l); |
bucket = create_pbucket(); |
bucket = create_pbucket(); |
if ( !(sp0 = nd_sp_f4(m,l,bucket)) |
stat = nd_sp_f4(m,l,bucket,&sp0); |
|| !(col = nd_symbolic_preproc(bucket,&s0vect,&rp0)) ) { |
if ( !stat ) { |
for ( t = l; NEXT(t); t = NEXT(t) ); |
for ( t = l; NEXT(t); t = NEXT(t) ); |
NEXT(t) = d; d = l; |
NEXT(t) = d; d = l; |
d = nd_reconstruct(m,0,d); |
d = nd_reconstruct(m,0,d); |
continue; |
continue; |
} |
} |
|
if ( !sp0 ) continue; |
|
col = nd_symbolic_preproc(bucket,&s0vect,&rp0); |
|
if ( !col ) { |
|
for ( t = l; NEXT(t); t = NEXT(t) ); |
|
NEXT(t) = d; d = l; |
|
d = nd_reconstruct(m,0,d); |
|
continue; |
|
} |
|
|
nsp = length(sp0); nred = length(rp0); spcol = col-nred; |
nsp = length(sp0); nred = length(rp0); spcol = col-nred; |
imat = (IndArray *)MALLOC(nred*sizeof(IndArray)); |
imat = (IndArray *)MALLOC(nred*sizeof(IndArray)); |
Line 4080 NODE nd_f4(int m) |
|
Line 4006 NODE nd_f4(int m) |
|
for ( r = g; r; r = NEXT(r) ) BDY(r) = (pointer)nd_ps[(int)BDY(r)]; |
for ( r = g; r; r = NEXT(r) ) BDY(r) = (pointer)nd_ps[(int)BDY(r)]; |
return g; |
return g; |
} |
} |
|
#endif |