version 1.221, 2015/03/15 19:31:30 |
version 1.229, 2016/11/17 05:33:20 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.220 2015/01/13 00:54:54 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.228 2016/08/08 07:18:10 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 56 static int nd_found,nd_create,nd_notfirst; |
|
Line 56 static int nd_found,nd_create,nd_notfirst; |
|
static int nmv_adv; |
static int nmv_adv; |
static int nd_demand; |
static int nd_demand; |
static int nd_module,nd_ispot,nd_mpos,nd_pot_nelim; |
static int nd_module,nd_ispot,nd_mpos,nd_pot_nelim; |
|
static int nd_module_rank,nd_poly_weight_len; |
|
static int *nd_poly_weight,*nd_module_weight; |
static NODE nd_tracelist; |
static NODE nd_tracelist; |
static NODE nd_alltracelist; |
static NODE nd_alltracelist; |
static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect; |
static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect; |
Line 91 ND ndgztond(ND p); |
|
Line 93 ND ndgztond(ND p); |
|
void Pdp_set_weight(NODE,VECT *); |
void Pdp_set_weight(NODE,VECT *); |
void Pox_cmo_rpc(NODE,Obj *); |
void Pox_cmo_rpc(NODE,Obj *); |
|
|
extern int Denominator,DP_Multiple; |
extern int Denominator,DP_Multiple,MaxDeg; |
|
|
#define BLEN (8*sizeof(unsigned long)) |
#define BLEN (8*sizeof(unsigned long)) |
|
|
Line 647 int ndl_ww_lex_compare(UINT *d1,UINT *d2) |
|
Line 649 int ndl_ww_lex_compare(UINT *d1,UINT *d2) |
|
return ndl_lex_compare(d1,d2); |
return ndl_lex_compare(d1,d2); |
} |
} |
|
|
|
int ndl_module_weight_compare(UINT *d1,UINT *d2) |
|
{ |
|
int s,j; |
|
|
|
if ( nd_nvar != nd_poly_weight_len ) |
|
error("invalid module weight : the length of polynomial weight != the number of variables"); |
|
s = 0; |
|
for ( j = 0; j < nd_nvar; j++ ) |
|
s += (GET_EXP(d1,j)-GET_EXP(d2,j))*nd_poly_weight[j]; |
|
if ( MPOS(d1) >= 1 && MPOS(d2) >= 1 ) { |
|
s += nd_module_weight[MPOS(d1)-1]-nd_module_weight[MPOS(d2)-1]; |
|
} |
|
if ( s > 0 ) return 1; |
|
else if ( s < 0 ) return -1; |
|
else return 0; |
|
} |
|
|
int ndl_module_grlex_compare(UINT *d1,UINT *d2) |
int ndl_module_grlex_compare(UINT *d1,UINT *d2) |
{ |
{ |
int i,c; |
int i,c; |
|
|
|
if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return c; |
if ( nd_ispot ) { |
if ( nd_ispot ) { |
if ( nd_pot_nelim && MPOS(d1)>=nd_pot_nelim+1 && MPOS(d2) >= nd_pot_nelim+1 ) { |
if ( nd_pot_nelim && MPOS(d1)>=nd_pot_nelim+1 && MPOS(d2) >= nd_pot_nelim+1 ) { |
if ( TD(d1) > TD(d2) ) return 1; |
if ( TD(d1) > TD(d2) ) return 1; |
Line 677 int ndl_module_glex_compare(UINT *d1,UINT *d2) |
|
Line 697 int ndl_module_glex_compare(UINT *d1,UINT *d2) |
|
{ |
{ |
int i,c; |
int i,c; |
|
|
|
if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return 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; |
Line 695 int ndl_module_lex_compare(UINT *d1,UINT *d2) |
|
Line 716 int ndl_module_lex_compare(UINT *d1,UINT *d2) |
|
{ |
{ |
int i,c; |
int i,c; |
|
|
|
if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return 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; |
Line 711 int ndl_module_block_compare(UINT *d1,UINT *d2) |
|
Line 733 int ndl_module_block_compare(UINT *d1,UINT *d2) |
|
{ |
{ |
int i,c; |
int i,c; |
|
|
|
if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return 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; |
Line 727 int ndl_module_matrix_compare(UINT *d1,UINT *d2) |
|
Line 750 int ndl_module_matrix_compare(UINT *d1,UINT *d2) |
|
{ |
{ |
int i,c; |
int i,c; |
|
|
|
if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return 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; |
Line 743 int ndl_module_composite_compare(UINT *d1,UINT *d2) |
|
Line 767 int ndl_module_composite_compare(UINT *d1,UINT *d2) |
|
{ |
{ |
int i,c; |
int i,c; |
|
|
|
if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return 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; |
Line 1980 NODE nd_gb(int m,int ishomo,int checkonly,int gensyz,i |
|
Line 2005 NODE nd_gb(int m,int ishomo,int checkonly,int gensyz,i |
|
while ( d ) { |
while ( d ) { |
again: |
again: |
l = nd_minp(d,&d); |
l = nd_minp(d,&d); |
|
if ( MaxDeg > 0 && SG(l) > MaxDeg ) break; |
if ( SG(l) != sugar ) { |
if ( SG(l) != sugar ) { |
if ( ishomo ) { |
if ( ishomo ) { |
diag_count = 0; |
diag_count = 0; |
Line 2238 NODE nd_gb_trace(int m,int ishomo,int **indp) |
|
Line 2264 NODE nd_gb_trace(int m,int ishomo,int **indp) |
|
while ( d ) { |
while ( d ) { |
again: |
again: |
l = nd_minp(d,&d); |
l = nd_minp(d,&d); |
|
if ( MaxDeg > 0 && SG(l) > MaxDeg ) break; |
if ( SG(l) != sugar ) { |
if ( SG(l) != sugar ) { |
#if 1 |
#if 1 |
if ( ishomo ) { |
if ( ishomo ) { |
|
|
FREENDP(l); |
FREENDP(l); |
} |
} |
if ( nd_nalg ) { |
if ( nd_nalg ) { |
print_eg("monic",&eg_monic); |
if ( DP_Print ) { |
print_eg("invdalg",&eg_invdalg); |
print_eg("monic",&eg_monic); |
print_eg("le",&eg_le); |
print_eg("invdalg",&eg_invdalg); |
|
print_eg("le",&eg_le); |
|
} |
} |
} |
conv_ilist(nd_demand,1,g,indp); |
conv_ilist(nd_demand,1,g,indp); |
if ( DP_Print ) { printf("nd_gb_trace done.\n"); fflush(stdout); } |
if ( DP_Print ) { printf("nd_gb_trace done.\n"); fflush(stdout); } |
Line 3023 void nd_gr(LIST f,LIST v,int m,int homo,int retdp,int |
|
Line 3052 void nd_gr(LIST f,LIST v,int m,int homo,int retdp,int |
|
ndv_alloc = 0; |
ndv_alloc = 0; |
#endif |
#endif |
get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&nd_vc); |
get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&nd_vc); |
|
if ( m && nd_vc ) |
|
error("nd_{gr,f4} : computation over Fp(X) is unsupported. Use dp_gr_mod_main()."); |
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ ); |
switch ( ord->id ) { |
switch ( ord->id ) { |
case 1: |
case 1: |
Line 3537 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
Line 3568 void nd_gr_trace(LIST f,LIST v,int trace,int homo,int |
|
for ( t = fd0; t; t = NEXT(t) ) |
for ( t = fd0; t; t = NEXT(t) ) |
ndv_homogenize((NDV)BDY(t),obpe,oadv,oepos,ompos); |
ndv_homogenize((NDV)BDY(t),obpe,oadv,oepos,ompos); |
} |
} |
|
if ( MaxDeg > 0 ) nocheck = 1; |
while ( 1 ) { |
while ( 1 ) { |
tl1 = tl2 = tl3 = tl4 = 0; |
tl1 = tl2 = tl3 = tl4 = 0; |
if ( Demand ) |
if ( Demand ) |
Line 5249 NODE ndv_reducebase(NODE x,int *perm) |
|
Line 5281 NODE ndv_reducebase(NODE x,int *perm) |
|
|
|
void nd_init_ord(struct order_spec *ord) |
void nd_init_ord(struct order_spec *ord) |
{ |
{ |
nd_module = (ord->id >= 256); |
nd_module = (ord->id >= 256); |
|
if ( nd_module ) { |
|
nd_dcomp = -1; |
|
nd_ispot = ord->ispot; |
|
nd_pot_nelim = ord->pot_nelim; |
|
nd_poly_weight_len = ord->nv; |
|
nd_poly_weight = ord->top_weight; |
|
nd_module_rank = ord->module_rank; |
|
nd_module_weight = ord->module_top_weight; |
|
} |
nd_matrix = 0; |
nd_matrix = 0; |
nd_matrix_len = 0; |
nd_matrix_len = 0; |
switch ( ord->id ) { |
switch ( ord->id ) { |
Line 5305 void nd_init_ord(struct order_spec *ord) |
|
Line 5346 void nd_init_ord(struct order_spec *ord) |
|
|
|
/* module order */ |
/* module order */ |
case 256: |
case 256: |
nd_ispot = ord->ispot; |
|
nd_pot_nelim = ord->pot_nelim; |
|
nd_dcomp = -1; |
|
switch ( ord->ord.simple ) { |
switch ( ord->ord.simple ) { |
case 0: |
case 0: |
nd_isrlex = 1; |
nd_isrlex = 1; |
Line 5327 void nd_init_ord(struct order_spec *ord) |
|
Line 5365 void nd_init_ord(struct order_spec *ord) |
|
break; |
break; |
case 257: |
case 257: |
/* block order */ |
/* block order */ |
nd_ispot = ord->ispot; |
|
nd_pot_nelim = ord->pot_nelim; |
|
nd_dcomp = -1; |
|
nd_isrlex = 0; |
nd_isrlex = 0; |
ndl_compare_function = ndl_module_block_compare; |
ndl_compare_function = ndl_module_block_compare; |
break; |
break; |
case 258: |
case 258: |
/* matrix order */ |
/* matrix order */ |
nd_ispot = ord->ispot; |
|
nd_pot_nelim = ord->pot_nelim; |
|
nd_dcomp = -1; |
|
nd_isrlex = 0; |
nd_isrlex = 0; |
nd_matrix_len = ord->ord.matrix.row; |
nd_matrix_len = ord->ord.matrix.row; |
nd_matrix = ord->ord.matrix.matrix; |
nd_matrix = ord->ord.matrix.matrix; |
Line 5345 void nd_init_ord(struct order_spec *ord) |
|
Line 5377 void nd_init_ord(struct order_spec *ord) |
|
break; |
break; |
case 259: |
case 259: |
/* composite order */ |
/* composite order */ |
nd_ispot = ord->ispot; |
|
nd_pot_nelim = ord->pot_nelim; |
|
nd_dcomp = -1; |
|
nd_isrlex = 0; |
nd_isrlex = 0; |
nd_worb_len = ord->ord.composite.length; |
nd_worb_len = ord->ord.composite.length; |
nd_worb = ord->ord.composite.w_or_b; |
nd_worb = ord->ord.composite.w_or_b; |
Line 6179 NODE nd_f4(int m,int **indp) |
|
Line 6208 NODE nd_f4(int m,int **indp) |
|
get_eg(&eg0); |
get_eg(&eg0); |
l = nd_minsugarp(d,&d); |
l = nd_minsugarp(d,&d); |
sugar = SG(l); |
sugar = SG(l); |
|
if ( MaxDeg > 0 && sugar > MaxDeg ) break; |
if ( nd_nzlist ) { |
if ( nd_nzlist ) { |
for ( tn = nd_nzlist; tn; tn = NEXT(tn) ) { |
for ( tn = nd_nzlist; tn; tn = NEXT(tn) ) { |
node = BDY((LIST)BDY(tn)); |
node = BDY((LIST)BDY(tn)); |
Line 6291 NODE nd_f4_trace(int m,int **indp) |
|
Line 6321 NODE nd_f4_trace(int m,int **indp) |
|
get_eg(&eg0); |
get_eg(&eg0); |
l = nd_minsugarp(d,&d); |
l = nd_minsugarp(d,&d); |
sugar = SG(l); |
sugar = SG(l); |
|
if ( MaxDeg > 0 && sugar > MaxDeg ) break; |
bucket = create_pbucket(); |
bucket = create_pbucket(); |
stat = nd_sp_f4(m,0,l,bucket); |
stat = nd_sp_f4(m,0,l,bucket); |
if ( !stat ) { |
if ( !stat ) { |
Line 6600 init_eg(&eg_search); |
|
Line 6631 init_eg(&eg_search); |
|
} |
} |
} |
} |
mat->row = i; |
mat->row = i; |
fprintf(asir_out,"%dx%d,",mat->row,mat->col); fflush(asir_out); |
if ( DP_Print ) { |
|
fprintf(asir_out,"%dx%d,",mat->row,mat->col); fflush(asir_out); |
|
} |
size = ((col+BLEN-1)/BLEN)*sizeof(unsigned long); |
size = ((col+BLEN-1)/BLEN)*sizeof(unsigned long); |
v = CALLOC((col+BLEN-1)/BLEN,sizeof(unsigned long)); |
v = CALLOC((col+BLEN-1)/BLEN,sizeof(unsigned long)); |
for ( rp = rp0, i = 0; rp; rp = NEXT(rp), i++ ) { |
for ( rp = rp0, i = 0; rp; rp = NEXT(rp), i++ ) { |
Line 6654 init_eg(&eg_search); |
|
Line 6687 init_eg(&eg_search); |
|
for ( i = 0; i < col; i++ ) rhead[i] = 0; |
for ( i = 0; i < col; i++ ) rhead[i] = 0; |
|
|
/* construction of index arrays */ |
/* construction of index arrays */ |
fprintf(stderr,"%dx%d,",nsp+nred,col); |
if ( DP_Print ) { |
|
fprintf(stderr,"%dx%d,",nsp+nred,col); |
|
} |
rvect = (NM_ind_pair *)ALLOCA(nred*sizeof(NM_ind_pair)); |
rvect = (NM_ind_pair *)ALLOCA(nred*sizeof(NM_ind_pair)); |
s0hash = (int *)ALLOCA(col*sizeof(int)); |
s0hash = (int *)ALLOCA(col*sizeof(int)); |
for ( i = 0, s = s0vect; i < col; i++, s += nd_wpd ) |
for ( i = 0, s = s0vect; i < col; i++, s += nd_wpd ) |
Line 6668 init_eg(&eg_search); |
|
Line 6703 init_eg(&eg_search); |
|
r0 = nd_f4_red_main(m,sp0,nsp,s0vect,col,rvect,rhead,imat,nred,nz); |
r0 = nd_f4_red_main(m,sp0,nsp,s0vect,col,rvect,rhead,imat,nred,nz); |
else |
else |
r0 = nd_f4_red_gz_main(sp0,nsp,trace,s0vect,col,rvect,rhead,imat,nred); |
r0 = nd_f4_red_gz_main(sp0,nsp,trace,s0vect,col,rvect,rhead,imat,nred); |
print_eg("search",&eg_search); |
if ( DP_Print ) print_eg("search",&eg_search); |
return r0; |
return r0; |
} |
} |
|
|
Line 7641 void nd_det(int mod,MAT f,P *rp) |
|
Line 7676 void nd_det(int mod,MAT f,P *rp) |
|
if ( mod ) ndv_mod(mod,d); |
if ( mod ) ndv_mod(mod,d); |
chsgnq(ONE,&mone); |
chsgnq(ONE,&mone); |
for ( j = 0, sgn = 1; j < n; j++ ) { |
for ( j = 0, sgn = 1; j < n; j++ ) { |
if ( DP_Print ) fprintf(stderr,".",j); |
if ( DP_Print ) { |
|
fprintf(stderr,".",j); |
|
} |
for ( i = j; i < n && !dm[i][j]; i++ ); |
for ( i = j; i < n && !dm[i][j]; i++ ); |
if ( i == n ) { |
if ( i == n ) { |
*rp = 0; |
*rp = 0; |
Line 7700 void nd_det(int mod,MAT f,P *rp) |
|
Line 7737 void nd_det(int mod,MAT f,P *rp) |
|
} |
} |
d = mjj; |
d = mjj; |
} |
} |
if ( DP_Print ) fprintf(stderr,"\n",k); |
if ( DP_Print ) { |
|
fprintf(stderr,"\n",k); |
|
} |
if ( sgn < 0 ) |
if ( sgn < 0 ) |
if ( mod ) |
if ( mod ) |
ndv_mul_c(mod,d,mod-1); |
ndv_mul_c(mod,d,mod-1); |