version 1.91, 2004/03/13 07:32:08 |
version 1.93, 2004/03/13 07:48:30 |
|
|
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.90 2004/03/13 06:49:15 noro Exp $ */ |
/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.92 2004/03/13 07:43:24 noro Exp $ */ |
|
|
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
Line 1764 ND normalize_pbucket(int mod,PGeoBucket g) |
|
Line 1764 ND normalize_pbucket(int mod,PGeoBucket g) |
|
return r; |
return r; |
} |
} |
|
|
|
void do_diagonalize(int sugar,int m) |
|
{ |
|
int i,nh,stat; |
|
NODE r,g,t; |
|
ND h,nf,s,head; |
|
NDV nfv; |
|
Q q,num,den; |
|
union oNDC dn; |
|
|
|
for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) { |
|
if ( nd_demand ) |
|
nfv = ndv_load(i); |
|
else |
|
nfv = nd_ps[i]; |
|
s = ndvtond(m,nfv); |
|
s = nd_separate_head(s,&head); |
|
nd_nf(m,s,nd_ps,1,&dn,&nf); |
|
if ( !m ) { |
|
NTOQ(NM(dn.z),SGN(dn.z),num); |
|
mulq(HCQ(head),num,&q); HCQ(head) = q; |
|
if ( DN(dn.z) ) { |
|
NTOQ(DN(dn.z),1,den); |
|
nd_mul_c_q(nf,den); |
|
} |
|
} |
|
nf = nd_add(m,head,nf); |
|
ndv_free(nfv); |
|
nd_removecont(m,nf); |
|
nfv = ndtondv(m,nf); |
|
nd_free(nf); |
|
nd_bound[i] = ndv_compute_bound(nfv); |
|
if ( nd_demand ) { |
|
ndv_save(nfv,i); |
|
ndv_free(nfv); |
|
} else |
|
nd_ps[i] = nfv; |
|
} |
|
} |
|
|
/* return value = 0 => input is not a GB */ |
/* return value = 0 => input is not a GB */ |
|
|
NODE nd_gb(int m,int ishomo,int checkonly) |
NODE nd_gb(int m,int ishomo,int checkonly) |
Line 1787 NODE nd_gb(int m,int ishomo,int checkonly) |
|
Line 1826 NODE nd_gb(int m,int ishomo,int checkonly) |
|
again: |
again: |
l = nd_minp(d,&d); |
l = nd_minp(d,&d); |
if ( SG(l) != sugar ) { |
if ( SG(l) != sugar ) { |
if ( ishomo ) { |
if ( ishomo ) do_diagonalize(sugar,m); |
for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) { |
|
if ( nd_demand ) |
|
nfv = ndv_load(i); |
|
else |
|
nfv = nd_ps[i]; |
|
s = ndvtond(m,nfv); |
|
s = nd_separate_head(s,&head); |
|
nd_nf(m,s,nd_ps,1,&dn,&nf); |
|
if ( !m ) { |
|
NTOQ(NM(dn.z),SGN(dn.z),num); |
|
mulq(HCQ(head),num,&q); HCQ(head) = q; |
|
if ( DN(dn.z) ) { |
|
NTOQ(DN(dn.z),1,den); |
|
nd_mul_c_q(nf,den); |
|
} |
|
} |
|
nf = nd_add(m,head,nf); |
|
ndv_free(nfv); |
|
nd_removecont(m,nf); |
|
nfv = ndtondv(m,nf); |
|
nd_free(nf); |
|
nd_bound[i] = ndv_compute_bound(nfv); |
|
if ( nd_demand ) { |
|
ndv_save(nfv,i); |
|
ndv_free(nfv); |
|
} else |
|
nd_ps[i] = nfv; |
|
} |
|
} |
|
sugar = SG(l); |
sugar = SG(l); |
if ( DP_Print ) fprintf(asir_out,"%d",sugar); |
if ( DP_Print ) fprintf(asir_out,"%d",sugar); |
} |
} |
|
|
return g; |
return g; |
} |
} |
|
|
void do_diagonalize(int sugar,int m) |
void do_diagonalize_trace(int sugar,int m) |
{ |
{ |
int i,nh,stat; |
int i,nh,stat; |
NODE r,g,t; |
NODE r,g,t; |
Line 1926 NODE nd_gb_trace(int m,int ishomo) |
|
Line 1937 NODE nd_gb_trace(int m,int ishomo) |
|
again: |
again: |
l = nd_minp(d,&d); |
l = nd_minp(d,&d); |
if ( SG(l) != sugar ) { |
if ( SG(l) != sugar ) { |
if ( ishomo ) do_diagonalize(sugar,m); |
if ( ishomo ) do_diagonalize_trace(sugar,m); |
sugar = SG(l); |
sugar = SG(l); |
if ( DP_Print ) fprintf(asir_out,"%d",sugar); |
if ( DP_Print ) fprintf(asir_out,"%d",sugar); |
} |
} |