version 1.163, 2009/01/05 06:29:46 |
version 1.166, 2009/02/03 08:08:01 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.162 2009/01/05 02:47:39 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.165 2009/02/02 02:40:42 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 217 INLINE int ndl_reducible(UINT *d1,UINT *d2) |
|
Line 217 INLINE int ndl_reducible(UINT *d1,UINT *d2) |
|
* order is either 0 or 2. |
* order is either 0 or 2. |
*/ |
*/ |
|
|
void ndl_homogenize(UINT *d,UINT *r,int obpe,EPOS oepos,int weight) |
void ndl_homogenize(UINT *d,UINT *r,int obpe,EPOS oepos,int ompos,int weight) |
{ |
{ |
int w,i,e,n,omask0; |
int w,i,e,n,omask0; |
|
|
Line 230 void ndl_homogenize(UINT *d,UINT *r,int obpe,EPOS oepo |
|
Line 230 void ndl_homogenize(UINT *d,UINT *r,int obpe,EPOS oepo |
|
} |
} |
w = TD(d); |
w = TD(d); |
PUT_EXP(r,nd_nvar-1,weight-w); |
PUT_EXP(r,nd_nvar-1,weight-w); |
if ( nd_module ) MPOS(r) = MPOS(d); |
if ( nd_module ) MPOS(r) = d[ompos]; |
TD(r) = weight; |
TD(r) = weight; |
if ( nd_blockmask ) ndl_weight_mask(r); |
if ( nd_blockmask ) ndl_weight_mask(r); |
} |
} |
Line 568 int ndl_ww_lex_compare(UINT *d1,UINT *d2) |
|
Line 568 int ndl_ww_lex_compare(UINT *d1,UINT *d2) |
|
|
|
int ndl_module_grlex_compare(UINT *d1,UINT *d2) |
int ndl_module_grlex_compare(UINT *d1,UINT *d2) |
{ |
{ |
int i; |
int i,c; |
|
|
if ( nd_ispot ) { |
if ( nd_ispot ) { |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
Line 576 int ndl_module_grlex_compare(UINT *d1,UINT *d2) |
|
Line 576 int ndl_module_grlex_compare(UINT *d1,UINT *d2) |
|
} |
} |
if ( TD(d1) > TD(d2) ) return 1; |
if ( TD(d1) > TD(d2) ) return 1; |
else if ( TD(d1) < TD(d2) ) return -1; |
else if ( TD(d1) < TD(d2) ) return -1; |
for ( i = nd_nvar-1; i >= 0; i-- ) |
if ( c = ndl_lex_compare(d1,d2) ) return c; |
if ( GET_EXP(d1,i) < GET_EXP(d2,i) ) return 1; |
|
else if ( GET_EXP(d1,i) > GET_EXP(d2,i) ) return -1; |
|
if ( !nd_ispot ) { |
if ( !nd_ispot ) { |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
else if ( MPOS(d1) > MPOS(d2) ) return -1; |
else if ( MPOS(d1) > MPOS(d2) ) return -1; |
Line 588 int ndl_module_grlex_compare(UINT *d1,UINT *d2) |
|
Line 586 int ndl_module_grlex_compare(UINT *d1,UINT *d2) |
|
|
|
int ndl_module_glex_compare(UINT *d1,UINT *d2) |
int ndl_module_glex_compare(UINT *d1,UINT *d2) |
{ |
{ |
int i; |
int i,c; |
|
|
if ( nd_ispot ) { |
if ( nd_ispot ) { |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
Line 596 int ndl_module_glex_compare(UINT *d1,UINT *d2) |
|
Line 594 int ndl_module_glex_compare(UINT *d1,UINT *d2) |
|
} |
} |
if ( TD(d1) > TD(d2) ) return 1; |
if ( TD(d1) > TD(d2) ) return 1; |
else if ( TD(d1) < TD(d2) ) return -1; |
else if ( TD(d1) < TD(d2) ) return -1; |
for ( i = 0; i < nd_nvar; i++ ) |
if ( c = ndl_lex_compare(d1,d2) ) return c; |
if ( GET_EXP(d1,i) > GET_EXP(d2,i) ) return 1; |
|
else if ( GET_EXP(d1,i) < GET_EXP(d2,i) ) return -1; |
|
if ( !nd_ispot ) { |
if ( !nd_ispot ) { |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
else if ( MPOS(d1) > MPOS(d2) ) return -1; |
else if ( MPOS(d1) > MPOS(d2) ) return -1; |
Line 608 int ndl_module_glex_compare(UINT *d1,UINT *d2) |
|
Line 604 int ndl_module_glex_compare(UINT *d1,UINT *d2) |
|
|
|
int ndl_module_lex_compare(UINT *d1,UINT *d2) |
int ndl_module_lex_compare(UINT *d1,UINT *d2) |
{ |
{ |
int i; |
int i,c; |
|
|
if ( nd_ispot ) { |
if ( nd_ispot ) { |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
else if ( MPOS(d1) > MPOS(d2) ) return -1; |
else if ( MPOS(d1) > MPOS(d2) ) return -1; |
} |
} |
for ( i = 0; i < nd_nvar; i++ ) |
if ( c = ndl_lex_compare(d1,d2) ) return c; |
if ( GET_EXP(d1,i) > GET_EXP(d2,i) ) return 1; |
|
else if ( GET_EXP(d1,i) < GET_EXP(d2,i) ) return -1; |
|
if ( !nd_ispot ) { |
if ( !nd_ispot ) { |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
if ( MPOS(d1) < MPOS(d2) ) return 1; |
else if ( MPOS(d1) > MPOS(d2) ) return -1; |
else if ( MPOS(d1) > MPOS(d2) ) return -1; |
Line 2823 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 2817 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
P p,zp; |
P p,zp; |
Q dmy; |
Q dmy; |
EPOS oepos; |
EPOS oepos; |
int obpe,oadv,wmax,i,len,cbpe,ishomo,nalg,mrank,trank; |
int obpe,oadv,wmax,i,len,cbpe,ishomo,nalg,mrank,trank,ompos; |
Alg alpha,dp; |
Alg alpha,dp; |
P poly; |
P poly; |
LIST f1,f2,zpl; |
LIST f1,f2,zpl; |
Line 2889 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 2883 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
} |
} |
} |
} |
nd_setup_parameters(nvar,max); |
nd_setup_parameters(nvar,max); |
obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos; |
obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos; ompos = nd_mpos; |
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 ) { |
Line 2918 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 2912 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
nd_init_ord(ord1); |
nd_init_ord(ord1); |
nd_setup_parameters(nvar+1,wmax); |
nd_setup_parameters(nvar+1,wmax); |
for ( t = fd0; t; t = NEXT(t) ) |
for ( t = fd0; t; t = NEXT(t) ) |
ndv_homogenize((NDV)BDY(t),obpe,oadv,oepos); |
ndv_homogenize((NDV)BDY(t),obpe,oadv,oepos,ompos); |
} |
} |
while ( 1 ) { |
while ( 1 ) { |
if ( Demand ) |
if ( Demand ) |
Line 3180 void ndv_removecont(int mod,NDV p) |
|
Line 3174 void ndv_removecont(int mod,NDV p) |
|
|
|
/* koko */ |
/* koko */ |
|
|
void ndv_homogenize(NDV p,int obpe,int oadv,EPOS oepos) |
void ndv_homogenize(NDV p,int obpe,int oadv,EPOS oepos,int ompos) |
{ |
{ |
int len,i,max; |
int len,i,max; |
NMV m,mr0,mr,t; |
NMV m,mr0,mr,t; |
Line 3193 void ndv_homogenize(NDV p,int obpe,int oadv,EPOS oepos |
|
Line 3187 void ndv_homogenize(NDV p,int obpe,int oadv,EPOS oepos |
|
mr = (NMV)((char *)mr0+(len-1)*nmv_adv); |
mr = (NMV)((char *)mr0+(len-1)*nmv_adv); |
t = (NMV)ALLOCA(nmv_adv); |
t = (NMV)ALLOCA(nmv_adv); |
for ( i = 0; i < len; i++, NMV_OPREV(m), NMV_PREV(mr) ) { |
for ( i = 0; i < len; i++, NMV_OPREV(m), NMV_PREV(mr) ) { |
ndl_homogenize(DL(m),DL(t),obpe,oepos,max); |
ndl_homogenize(DL(m),DL(t),obpe,oepos,ompos,max); |
CQ(mr) = CQ(m); |
CQ(mr) = CQ(m); |
ndl_copy(DL(t),DL(mr)); |
ndl_copy(DL(t),DL(mr)); |
} |
} |
Line 3203 void ndv_homogenize(NDV p,int obpe,int oadv,EPOS oepos |
|
Line 3197 void ndv_homogenize(NDV p,int obpe,int oadv,EPOS oepos |
|
|
|
void ndv_dehomogenize(NDV p,struct order_spec *ord) |
void ndv_dehomogenize(NDV p,struct order_spec *ord) |
{ |
{ |
int i,j,adj,len,newnvar,newwpd,newadv,newexporigin; |
int i,j,adj,len,newnvar,newwpd,newadv,newexporigin,newmpos; |
|
int pos; |
Q *w; |
Q *w; |
Q dvr,t; |
Q dvr,t; |
NMV m,r; |
NMV m,r; |
Line 3211 void ndv_dehomogenize(NDV p,struct order_spec *ord) |
|
Line 3206 void ndv_dehomogenize(NDV p,struct order_spec *ord) |
|
len = p->len; |
len = p->len; |
newnvar = nd_nvar-1; |
newnvar = nd_nvar-1; |
newexporigin = nd_get_exporigin(ord); |
newexporigin = nd_get_exporigin(ord); |
|
if ( nd_module ) newmpos = newexporigin-1; |
newwpd = newnvar/nd_epw+(newnvar%nd_epw?1:0)+newexporigin; |
newwpd = newnvar/nd_epw+(newnvar%nd_epw?1:0)+newexporigin; |
for ( m = BDY(p), i = 0; i < len; NMV_ADV(m), i++ ) |
for ( m = BDY(p), i = 0; i < len; NMV_ADV(m), i++ ) |
ndl_dehomogenize(DL(m)); |
ndl_dehomogenize(DL(m)); |
Line 3218 void ndv_dehomogenize(NDV p,struct order_spec *ord) |
|
Line 3214 void ndv_dehomogenize(NDV p,struct order_spec *ord) |
|
newadv = ROUND_FOR_ALIGN(sizeof(struct oNMV)+(newwpd-1)*sizeof(UINT)); |
newadv = ROUND_FOR_ALIGN(sizeof(struct oNMV)+(newwpd-1)*sizeof(UINT)); |
for ( m = r = BDY(p), i = 0; i < len; NMV_ADV(m), NDV_NADV(r), i++ ) { |
for ( m = r = BDY(p), i = 0; i < len; NMV_ADV(m), NDV_NADV(r), i++ ) { |
CQ(r) = CQ(m); |
CQ(r) = CQ(m); |
|
if ( nd_module ) pos = MPOS(DL(m)); |
for ( j = 0; j < newexporigin; j++ ) DL(r)[j] = DL(m)[j]; |
for ( j = 0; j < newexporigin; j++ ) DL(r)[j] = DL(m)[j]; |
adj = nd_exporigin-newexporigin; |
adj = nd_exporigin-newexporigin; |
for ( ; j < newwpd; j++ ) DL(r)[j] = DL(m)[j+adj]; |
for ( ; j < newwpd; j++ ) DL(r)[j] = DL(m)[j+adj]; |
|
if ( nd_module ) { |
|
DL(r)[newmpos] = pos; |
|
} |
} |
} |
} |
} |
NV(p)--; |
NV(p)--; |
Line 3767 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
Line 3767 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
for ( i = 0; i < tlen; i++ ) tab[i] = 0; |
for ( i = 0; i < tlen; i++ ) tab[i] = 0; |
if ( !m0 || !m1 ) return; |
if ( !m0 || !m1 ) return; |
d0 = DL(m0); d1 = DL(m1); n2 = n>>1; |
d0 = DL(m0); d1 = DL(m1); n2 = n>>1; |
|
if ( nd_module ) |
|
if ( MPOS(d0) ) error("weyl_mul_nm_nmv : invalid operation"); |
|
|
NEWNM(m); d = DL(m); |
NEWNM(m); d = DL(m); |
if ( mod ) { |
if ( mod ) { |
c0 = CM(m0); c1 = CM(m1); DMAR(c0,c1,0,mod,c); CM(m) = c; |
c0 = CM(m0); c1 = CM(m1); DMAR(c0,c1,0,mod,c); CM(m) = c; |
Line 3781 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
Line 3784 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
TD(DL(m)) = h; |
TD(DL(m)) = h; |
if ( nd_blockmask ) ndl_weight_mask(DL(m)); |
if ( nd_blockmask ) ndl_weight_mask(DL(m)); |
} |
} |
if ( nd_module ) { |
|
mpos = MPOS(d1); |
|
TD(d1) = ndl_weight(d1); |
|
if ( MPOS(d0) ) error("weyl_mul_nm_nmv : invalid operation"); |
|
} |
|
tab[0] = m; |
tab[0] = m; |
NEWNM(m); d = DL(m); |
NEWNM(m); d = DL(m); |
for ( i = 0, curlen = 1; i < n2; i++ ) { |
for ( i = 0, curlen = 1; i < n2; i++ ) { |
Line 3820 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
Line 3818 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
TD(d) = s; |
TD(d) = s; |
PUT_EXP(d,n-1,s-h); |
PUT_EXP(d,n-1,s-h); |
} else TD(d) = h; |
} else TD(d) = h; |
if ( nd_module ) { |
|
MPOS(d) = mpos; |
|
TD(d) = ndl_weight(d); |
|
} |
|
if ( nd_blockmask ) ndl_weight_mask(d); |
if ( nd_blockmask ) ndl_weight_mask(d); |
if ( mod ) c = ctab[j]; |
if ( mod ) c = ctab[j]; |
else q = ctab_q[j]; |
else q = ctab_q[j]; |
Line 3856 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
Line 3850 void weyl_mul_nm_nmv(int n,int mod,NM m0,NMV m1,NM *ta |
|
curlen *= k+1; |
curlen *= k+1; |
} |
} |
FREENM(m); |
FREENM(m); |
|
if ( nd_module ) { |
|
mpos = MPOS(d1); |
|
for ( i = 0; i < tlen; i++ ) |
|
if ( tab[i] ) { |
|
d = DL(tab[i]); |
|
MPOS(d) = mpos; |
|
TD(d) = ndl_weight(d); |
|
} |
|
} |
} |
} |
|
|
ND ndv_mul_nm_symbolic(NM m0,NDV p) |
ND ndv_mul_nm_symbolic(NM m0,NDV p) |
Line 4472 void nd_init_ord(struct order_spec *ord) |
|
Line 4475 void nd_init_ord(struct order_spec *ord) |
|
case 256: |
case 256: |
nd_ispot = ord->ispot; |
nd_ispot = ord->ispot; |
nd_dcomp = -1; |
nd_dcomp = -1; |
nd_isrlex = 0; |
|
switch ( ord->ord.simple ) { |
switch ( ord->ord.simple ) { |
case 0: |
case 0: |
|
nd_isrlex = 1; |
ndl_compare_function = ndl_module_grlex_compare; |
ndl_compare_function = ndl_module_grlex_compare; |
break; |
break; |
case 1: |
case 1: |
|
nd_isrlex = 0; |
ndl_compare_function = ndl_module_glex_compare; |
ndl_compare_function = ndl_module_glex_compare; |
break; |
break; |
case 2: |
case 2: |
|
nd_isrlex = 0; |
ndl_compare_function = ndl_module_lex_compare; |
ndl_compare_function = ndl_module_lex_compare; |
break; |
break; |
default: |
default: |
Line 4514 BlockMask nd_create_blockmask(struct order_spec *ord) |
|
Line 4519 BlockMask nd_create_blockmask(struct order_spec *ord) |
|
BlockMask bm; |
BlockMask bm; |
|
|
/* we only create mask table for block order */ |
/* we only create mask table for block order */ |
if ( ord->id != 1 ) |
if ( ord->id != 1 && ord->id != 257 ) |
return 0; |
return 0; |
n = ord->ord.block.length; |
n = ord->ord.block.length; |
bm = (BlockMask)MALLOC(sizeof(struct oBlockMask)); |
bm = (BlockMask)MALLOC(sizeof(struct oBlockMask)); |
Line 4538 EPOS nd_create_epos(struct order_spec *ord) |
|
Line 4543 EPOS nd_create_epos(struct order_spec *ord) |
|
|
|
epos = (EPOS)MALLOC_ATOMIC(nd_nvar*sizeof(struct oEPOS)); |
epos = (EPOS)MALLOC_ATOMIC(nd_nvar*sizeof(struct oEPOS)); |
switch ( ord->id ) { |
switch ( ord->id ) { |
case 0: |
case 0: case 256: |
if ( nd_isrlex ) { |
if ( nd_isrlex ) { |
for ( i = 0; i < nd_nvar; i++ ) { |
for ( i = 0; i < nd_nvar; i++ ) { |
epos[i].i = nd_exporigin + (nd_nvar-1-i)/nd_epw; |
epos[i].i = nd_exporigin + (nd_nvar-1-i)/nd_epw; |
Line 4551 EPOS nd_create_epos(struct order_spec *ord) |
|
Line 4556 EPOS nd_create_epos(struct order_spec *ord) |
|
} |
} |
} |
} |
break; |
break; |
case 1: |
case 1: case 257: |
/* block order */ |
/* block order */ |
l = ord->ord.block.length; |
l = ord->ord.block.length; |
op = ord->ord.block.order_pair; |
op = ord->ord.block.order_pair; |