version 1.47, 2003/08/25 09:19:43 |
version 1.50, 2003/08/27 01:48:25 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.46 2003/08/25 09:16:55 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.49 2003/08/26 01:54:18 noro Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
#include "inline.h" |
#include "inline.h" |
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 2062 void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o |
|
Line 2066 void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o |
|
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 2347 void ndv_dehomogenize(NDV p,struct order_spec *ord) |
|
Line 2351 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 2507 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; |
{ |
|
|
nd_epw = (sizeof(unsigned int)*8)/nd_bpe; |
|
elen = nd_nvar/nd_epw+(nd_nvar%nd_epw?1:0); |
|
|
|
switch ( nd_ord->id ) { |
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_setup_parameters : 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++ ) { |