version 1.46, 2003/08/25 09:16:55 |
version 1.52, 2003/08/27 02:21:16 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.45 2003/08/25 08:57:31 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.51 2003/08/27 01:53:29 noro Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
#include "inline.h" |
#include "inline.h" |
|
|
#define INLINE |
#define INLINE |
#endif |
#endif |
|
|
#define USE_GEOBUCKET 0 |
#define USE_GEOBUCKET 1 |
|
|
#define REDTAB_LEN 32003 |
#define REDTAB_LEN 32003 |
|
|
Line 218 int crit_2( int dp1, int dp2 ); |
|
Line 218 int crit_2( int dp1, int dp2 ); |
|
|
|
/* top level functions */ |
/* top level functions */ |
void nd_gr(LIST f,LIST v,int m,struct order_spec *ord,LIST *rp); |
void nd_gr(LIST f,LIST v,int m,struct order_spec *ord,LIST *rp); |
void nd_gr_trace(LIST f,LIST v,int m,int homo,struct order_spec *ord,LIST *rp); |
void nd_gr_trace(LIST f,LIST v,int trace,int homo,struct order_spec *ord,LIST *rp); |
NODE nd_gb(int m,int checkonly); |
NODE nd_gb(int m,int checkonly); |
NODE nd_gb_trace(int m); |
NODE nd_gb_trace(int m); |
|
|
Line 271 void nd_reconstruct_direct(int mod,NDV *ps,int len); |
|
Line 271 void nd_reconstruct_direct(int mod,NDV *ps,int len); |
|
void nd_setup(int mod,int trace,NODE f); |
void nd_setup(int mod,int trace,NODE f); |
void nd_setup_parameters(); |
void nd_setup_parameters(); |
BlockMask nd_create_blockmask(struct order_spec *ord); |
BlockMask nd_create_blockmask(struct order_spec *ord); |
|
int nd_get_exporigin(struct order_spec *ord); |
|
|
/* ND functions */ |
/* ND functions */ |
int nd_check_candidate(NODE input,NODE cand); |
int nd_check_candidate(NODE input,NODE cand); |
Line 1617 NODE nd_reduceall(int m,NODE f) |
|
Line 1618 NODE nd_reduceall(int m,NODE f) |
|
base.ps = (NDV *)ALLOCA((n-1)*sizeof(NDV)); |
base.ps = (NDV *)ALLOCA((n-1)*sizeof(NDV)); |
base.bound = (unsigned int **)ALLOCA((n-1)*sizeof(unsigned int *)); |
base.bound = (unsigned int **)ALLOCA((n-1)*sizeof(unsigned int *)); |
base.len = n-1; |
base.len = n-1; |
for ( i = 0; i < n; i++ ) { |
i = 0; |
again: |
while ( i < n ) { |
for ( j = 0; j < i; j++ ) { |
for ( j = 0; j < i; j++ ) { |
base.ps[j] = ps[j]; base.bound[j] = bound[j]; |
base.ps[j] = ps[j]; base.bound[j] = bound[j]; |
} |
} |
|
|
} |
} |
g = ndvtond(m,ps[i]); |
g = ndvtond(m,ps[i]); |
stat = nd_nf_direct(m,g,&base,1,&nf); |
stat = nd_nf_direct(m,g,&base,1,&nf); |
if ( !stat ) { |
if ( !stat ) |
nd_reconstruct_direct(m,ps,n); |
nd_reconstruct_direct(m,ps,n); |
goto again; |
|
} |
|
else if ( !nf ) { |
else if ( !nf ) { |
printf("."); fflush(stdout); |
printf("."); fflush(stdout); |
ndv_free(ps[i]); |
ndv_free(ps[i]); |
for ( j = i+1; j < n; j++ ) ps[j-1] = ps[j]; |
for ( j = i+1; j < n; j++ ) { |
|
ps[j-1] = ps[j]; bound[j-1] = bound[j]; |
|
} |
n--; |
n--; |
|
base.len = n-1; |
} else { |
} else { |
printf("."); fflush(stdout); |
printf("."); fflush(stdout); |
ndv_free(ps[i]); |
ndv_free(ps[i]); |
|
|
ps[i] = ndtondv(m,nf); |
ps[i] = ndtondv(m,nf); |
bound[i] = ndv_compute_bound(ps[i]); |
bound[i] = ndv_compute_bound(ps[i]); |
nd_free(nf); |
nd_free(nf); |
|
i++; |
} |
} |
} |
} |
printf("\n"); |
printf("\n"); |
Line 1999 void nd_gr(LIST f,LIST v,int m,struct order_spec *ord, |
|
Line 2002 void nd_gr(LIST f,LIST v,int m,struct order_spec *ord, |
|
x = nd_gb(m,0); |
x = nd_gb(m,0); |
fprintf(asir_out,"found=%d,notfirst=%d,create=%d\n", |
fprintf(asir_out,"found=%d,notfirst=%d,create=%d\n", |
nd_found,nd_notfirst,nd_create); |
nd_found,nd_notfirst,nd_create); |
|
x = nd_reducebase(x); |
x = nd_reduceall(m,x); |
x = nd_reduceall(m,x); |
for ( r0 = 0, t = x; t; t = NEXT(t) ) { |
for ( r0 = 0, t = x; t; t = NEXT(t) ) { |
NEXTNODE(r0,r); |
NEXTNODE(r0,r); |
Line 2014 void nd_gr(LIST f,LIST v,int m,struct order_spec *ord, |
|
Line 2018 void nd_gr(LIST f,LIST v,int m,struct order_spec *ord, |
|
MKLIST(*rp,r0); |
MKLIST(*rp,r0); |
} |
} |
|
|
void nd_gr_trace(LIST f,LIST v,int m,int homo,struct order_spec *ord,LIST *rp) |
void nd_gr_trace(LIST f,LIST v,int trace,int homo,struct order_spec *ord,LIST *rp) |
{ |
{ |
struct order_spec ord1; |
struct order_spec ord1; |
VL fv,vv,vc; |
VL fv,vv,vc; |
NODE fd,fd0,in0,in,r,r0,t,s,cand; |
NODE fd,fd0,in0,in,r,r0,t,s,cand; |
|
int m,nocheck,nvar,mindex; |
DP a,b,c,h; |
DP a,b,c,h; |
P p; |
P p; |
|
|
get_vars((Obj)f,&fv); pltovl(v,&vv); |
get_vars((Obj)f,&fv); pltovl(v,&vv); |
nd_nvar = length(vv); |
nvar = length(vv); |
|
nocheck = 0; |
|
mindex = 0; |
|
|
|
/* setup modulus */ |
|
if ( trace < 0 ) { |
|
trace = -trace; |
|
nocheck = 1; |
|
} |
|
m = trace > 1 ? trace : get_lprime(mindex); |
|
|
initd(ord); |
initd(ord); |
if ( homo ) { |
if ( homo ) { |
homogenize_order(ord,nd_nvar,&ord1); |
homogenize_order(ord,nd_nvar,&ord1); |
Line 2036 void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o |
|
Line 2051 void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o |
|
} |
} |
if ( fd0 ) NEXT(fd) = 0; |
if ( fd0 ) NEXT(fd) = 0; |
if ( in0 ) NEXT(in) = 0; |
if ( in0 ) NEXT(in) = 0; |
nd_init_ord(&ord1); |
|
initd(&ord1); |
|
nd_nvar++; |
|
} else { |
} else { |
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
ptod(CO,vv,(P)BDY(t),&c); |
ptod(CO,vv,(P)BDY(t),&c); |
Line 2048 void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o |
|
Line 2060 void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o |
|
} |
} |
if ( fd0 ) NEXT(fd) = 0; |
if ( fd0 ) NEXT(fd) = 0; |
in0 = fd0; |
in0 = fd0; |
nd_init_ord(ord); |
|
} |
} |
do { |
while ( 1 ) { |
|
if ( homo ) { |
|
nd_init_ord(&ord1); |
|
initd(&ord1); |
|
nd_nvar = nvar+1; |
|
} else { |
|
nd_init_ord(ord); |
|
nd_nvar = nvar; |
|
} |
nd_setup(m,1,fd0); |
nd_setup(m,1,fd0); |
cand = nd_gb_trace(m); |
cand = nd_gb_trace(m); |
if ( !cand ) continue; |
if ( !cand ) { |
|
/* failure */ |
|
if ( trace > 1 ) { |
|
*rp = 0; return; |
|
} else |
|
m = get_lprime(++mindex); |
|
continue; |
|
} |
|
|
if ( homo ) { |
if ( homo ) { |
/* dehomogenization */ |
/* dehomogenization */ |
for ( t = cand; t; t = NEXT(t) ) |
for ( t = cand; t; t = NEXT(t) ) |
ndv_dehomogenize((NDV)BDY(t),ord); |
ndv_dehomogenize((NDV)BDY(t),ord); |
nd_nvar--; |
nd_nvar = nvar; |
initd(ord); |
initd(ord); |
nd_init_ord(ord); |
nd_init_ord(ord); |
nd_setup_parameters(); |
nd_setup_parameters(); |
cand = nd_reducebase(cand); |
|
} |
} |
|
cand = nd_reducebase(cand); |
fprintf(asir_out,"found=%d,notfirst=%d,create=%d\n", |
fprintf(asir_out,"found=%d,notfirst=%d,create=%d\n", |
nd_found,nd_notfirst,nd_create); |
nd_found,nd_notfirst,nd_create); |
cand = nd_reduceall(0,cand); |
cand = nd_reduceall(0,cand); |
Line 2074 void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o |
|
Line 2101 void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o |
|
} |
} |
if ( r0 ) NEXT(r) = 0; |
if ( r0 ) NEXT(r) = 0; |
cand = r0; |
cand = r0; |
} while ( !nd_check_candidate(in0,cand) ); |
if ( nocheck || nd_check_candidate(in0,cand) ) |
|
/* success */ |
|
break; |
|
else if ( trace > 1 ) { |
|
/* failure */ |
|
*rp = 0; return; |
|
} else |
|
/* try the next modulus */ |
|
m = get_lprime(++mindex); |
|
} |
/* dp->p */ |
/* dp->p */ |
for ( r = cand; r; r = NEXT(r) ) { |
for ( r = cand; r; r = NEXT(r) ) { |
dtop(CO,vv,BDY(r),&p); |
dtop(CO,vv,BDY(r),&p); |
Line 2347 void ndv_dehomogenize(NDV p,struct order_spec *ord) |
|
Line 2383 void ndv_dehomogenize(NDV p,struct order_spec *ord) |
|
|
|
len = p->len; |
len = p->len; |
newnvar = nd_nvar-1; |
newnvar = nd_nvar-1; |
newexporigin = ord->ord.block.length+1; |
newexporigin = nd_get_exporigin(ord); |
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 2503 unsigned int *ndv_compute_bound(NDV p) |
|
Line 2539 unsigned int *ndv_compute_bound(NDV p) |
|
return t; |
return t; |
} |
} |
|
|
void nd_setup_parameters() { |
int nd_get_exporigin(struct order_spec *ord) |
int i,n,elen; |
{ |
|
switch ( ord->id ) { |
nd_epw = (sizeof(unsigned int)*8)/nd_bpe; |
|
elen = nd_nvar/nd_epw+(nd_nvar%nd_epw?1:0); |
|
|
|
switch ( nd_ord->id ) { |
|
case 0: |
case 0: |
nd_exporigin = 1; |
return 1; |
break; |
|
case 1: |
case 1: |
/* block order */ |
/* block order */ |
/* d[0]:weight d[1]:w0,...,d[nd_exporigin-1]:w(n-1) */ |
/* d[0]:weight d[1]:w0,...,d[nd_exporigin-1]:w(n-1) */ |
nd_exporigin = nd_ord->ord.block.length+1; |
return ord->ord.block.length+1; |
break; |
|
case 2: |
case 2: |
error("nd_setup_parameters : matrix order is not supported yet."); |
error("nd_get_exporigin : matrix order is not supported yet."); |
break; |
|
} |
} |
|
} |
|
|
|
void nd_setup_parameters() { |
|
int i,n,elen; |
|
|
|
nd_epw = (sizeof(unsigned int)*8)/nd_bpe; |
|
elen = nd_nvar/nd_epw+(nd_nvar%nd_epw?1:0); |
|
|
|
nd_exporigin = nd_get_exporigin(nd_ord); |
nd_wpd = nd_exporigin+elen; |
nd_wpd = nd_exporigin+elen; |
nd_epos = (EPOS)MALLOC_ATOMIC(nd_nvar*sizeof(struct oEPOS)); |
nd_epos = (EPOS)MALLOC_ATOMIC(nd_nvar*sizeof(struct oEPOS)); |
for ( i = 0; i < nd_nvar; i++ ) { |
for ( i = 0; i < nd_nvar; i++ ) { |