version 1.48, 2003/08/26 01:42:12 |
version 1.52, 2003/08/27 02:21:16 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.47 2003/08/25 09:19:43 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" |
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); |
|
|
|
|
} else if ( nf ) { |
} else if ( nf ) { |
if ( checkonly ) return 0; |
if ( checkonly ) return 0; |
printf("+"); fflush(stdout); |
printf("+"); fflush(stdout); |
ndl_print(HDL(nf)); |
|
nh = m?nd_newps(m,nf,0):nd_newps(m,0,nf); |
nh = m?nd_newps(m,nf,0):nd_newps(m,0,nf); |
d = update_pairs(d,g,nh); |
d = update_pairs(d,g,nh); |
g = update_base(g,nh); |
g = update_base(g,nh); |
Line 1619 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 2001 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 2016 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 2038 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 2050 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 2076 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 2507 unsigned int *ndv_compute_bound(NDV p) |
|
Line 2541 unsigned int *ndv_compute_bound(NDV p) |
|
|
|
int nd_get_exporigin(struct order_spec *ord) |
int nd_get_exporigin(struct order_spec *ord) |
{ |
{ |
switch ( nd_ord->id ) { |
switch ( ord->id ) { |
case 0: |
case 0: |
return 1; |
return 1; |
case 1: |
case 1: |
Line 2515 int nd_get_exporigin(struct order_spec *ord) |
|
Line 2549 int nd_get_exporigin(struct order_spec *ord) |
|
/* 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) */ |
return ord->ord.block.length+1; |
return ord->ord.block.length+1; |
case 2: |
case 2: |
error("nd_setup_parameters : matrix order is not supported yet."); |
error("nd_get_exporigin : matrix order is not supported yet."); |
} |
} |
} |
} |
|
|