version 1.24, 2020/06/19 10:18:13 |
version 1.25, 2020/06/19 22:58:48 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.23 2020/02/05 04:56:10 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.24 2020/06/19 10:18:13 noro Exp $ */ |
|
|
#include "nd.h" |
#include "nd.h" |
|
|
Line 1914 int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp |
|
Line 1914 int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp |
|
} |
} |
} |
} |
|
|
|
int nd_nf_pbucket_s(int mod,ND g,NDV *ps,int full,ND *rp) |
|
{ |
|
int hindex,index; |
|
NDV p; |
|
ND u,d,red; |
|
NODE l; |
|
NM mul,m,mrd,tail; |
|
int sugar,psugar,n,h_reducible; |
|
PGeoBucket bucket; |
|
int c,c1,c2; |
|
Z cg,cred,gcd,zzz; |
|
RHist h; |
|
double hmag,gmag; |
|
int count = 0; |
|
int hcount = 0; |
|
SIG sig; |
|
|
|
if ( !g ) { |
|
*rp = 0; |
|
return 1; |
|
} |
|
sugar = SG(g); |
|
n = NV(g); |
|
if ( !mod ) hmag = ((double)p_mag((P)HCZ(g)))*nd_scale; |
|
bucket = create_pbucket(); |
|
add_pbucket(mod,bucket,g); |
|
d = 0; |
|
mul = (NM)MALLOC(sizeof(struct oNM)+(nd_wpd-1)*sizeof(UINT)); |
|
sig = g->sig; |
|
while ( 1 ) { |
|
if ( mod > 0 || mod == -1 ) |
|
hindex = head_pbucket(mod,bucket); |
|
else if ( mod == -2 ) |
|
hindex = head_pbucket_lf(bucket); |
|
else |
|
hindex = head_pbucket_q(bucket); |
|
if ( hindex < 0 ) { |
|
if ( DP_Print > 3 ) printf("(%d %d)",count,hcount); |
|
if ( d ) { |
|
SG(d) = sugar; |
|
d->sig = sig; |
|
} |
|
*rp = d; |
|
return 1; |
|
} |
|
g = bucket->body[hindex]; |
|
index = ndl_find_reducer_s(HDL(g),sig); |
|
if ( index >= 0 && index < nd_psn ) { |
|
count++; |
|
if ( !d ) hcount++; |
|
h = nd_psh[index]; |
|
ndl_sub(HDL(g),DL(h),DL(mul)); |
|
if ( ndl_check_bound2(index,DL(mul)) ) { |
|
nd_free(d); |
|
free_pbucket(bucket); |
|
*rp = 0; |
|
return 0; |
|
} |
|
p = ps[index]; |
|
if ( mod == -1 ) |
|
CM(mul) = _mulsf(_invsf(HCM(p)),_chsgnsf(HCM(g))); |
|
else if ( mod == -2 ) { |
|
Z inv,t; |
|
divlf(ONE,HCZ(p),&inv); |
|
chsgnlf(HCZ(g),&t); |
|
mullf(inv,t,&CZ(mul)); |
|
} else if ( mod ) { |
|
c1 = invm(HCM(p),mod); c2 = mod-HCM(g); |
|
DMAR(c1,c2,0,mod,c); CM(mul) = c; |
|
} else { |
|
igcd_cofactor(HCZ(g),HCZ(p),&gcd,&cg,&cred); |
|
chsgnz(cg,&CZ(mul)); |
|
nd_mul_c_q(d,(P)cred); |
|
mulq_pbucket(bucket,cred); |
|
g = bucket->body[hindex]; |
|
gmag = (double)p_mag((P)HCZ(g)); |
|
} |
|
red = ndv_mul_nm(mod,mul,p); |
|
bucket->body[hindex] = nd_remove_head(g); |
|
red = nd_remove_head(red); |
|
add_pbucket(mod,bucket,red); |
|
psugar = SG(p)+TD(DL(mul)); |
|
sugar = MAX(sugar,psugar); |
|
if ( !mod && hmag && (gmag > hmag) ) { |
|
g = normalize_pbucket(mod,bucket); |
|
if ( !g ) { |
|
if ( d ) { |
|
SG(d) = sugar; |
|
d->sig = sig; |
|
} |
|
*rp = d; |
|
return 1; |
|
} |
|
nd_removecont2(d,g); |
|
hmag = ((double)p_mag((P)HCZ(g)))*nd_scale; |
|
add_pbucket(mod,bucket,g); |
|
} |
|
} else if ( index == -1 ) { |
|
// singular top reducible |
|
return -1; |
|
} else if ( !full ) { |
|
g = normalize_pbucket(mod,bucket); |
|
if ( g ) { |
|
SG(g) = sugar; |
|
g->sig = sig; |
|
} |
|
*rp = g; |
|
return 1; |
|
} else { |
|
m = BDY(g); |
|
if ( NEXT(m) ) { |
|
BDY(g) = NEXT(m); NEXT(m) = 0; LEN(g)--; |
|
} else { |
|
FREEND(g); g = 0; |
|
} |
|
bucket->body[hindex] = g; |
|
NEXT(m) = 0; |
|
if ( d ) { |
|
NEXT(tail)=m; tail=m; LEN(d)++; |
|
} else { |
|
MKND(n,m,1,d); tail = BDY(d); |
|
} |
|
} |
|
} |
|
} |
|
|
/* input : list of NDV, cand : list of NDV */ |
/* input : list of NDV, cand : list of NDV */ |
|
|
int ndv_check_membership(int m,NODE input,int obpe,int oadv,EPOS oepos,NODE cand) |
int ndv_check_membership(int m,NODE input,int obpe,int oadv,EPOS oepos,NODE cand) |
|
|
d = nd_reconstruct(0,d); |
d = nd_reconstruct(0,d); |
goto again; |
goto again; |
} |
} |
#if 0 && USE_GEOBUCKET |
#if USE_GEOBUCKET |
stat = m?nd_nf_pbucket_s(m,h,nd_ps,!Top,&nf):nd_nf_s(m,0,h,nd_ps,!Top,&nf); |
stat = m?nd_nf_pbucket_s(m,h,nd_ps,!Top,&nf):nd_nf_s(m,0,h,nd_ps,!Top,&nf); |
#else |
#else |
stat = nd_nf_s(m,0,h,nd_ps,!Top,&nf); |
stat = nd_nf_s(m,0,h,nd_ps,!Top,&nf); |
Line 4140 void nd_sba(LIST f,LIST v,int m,int homo,int retdp,str |
|
Line 4266 void nd_sba(LIST f,LIST v,int m,int homo,int retdp,str |
|
max = MAX(e,max); |
max = MAX(e,max); |
} |
} |
} |
} |
// nd_setup_parameters(nvar,max); |
nd_setup_parameters(nvar,max); |
nd_setup_parameters(nvar,16); |
|
obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos; ompos = nd_mpos; |
obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos; ompos = nd_mpos; |
ishomo = 1; |
ishomo = 1; |
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |
for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) { |