[BACK]Return to nd.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Diff for /OpenXM_contrib2/asir2000/engine/nd.c between version 1.30 and 1.31

version 1.30, 2003/08/12 09:07:19 version 1.31, 2003/08/13 03:13:22
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.29 2003/08/11 07:37:08 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.30 2003/08/12 09:07:19 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "inline.h"  #include "inline.h"
Line 18 
Line 18 
 typedef struct oPGeoBucket {  typedef struct oPGeoBucket {
         int m;          int m;
         struct oND *body[32];          struct oND *body[32];
         int len[32];  
 } *PGeoBucket;  } *PGeoBucket;
   
 typedef struct oND {  typedef struct oND {
         struct oNM *body;          struct oNM *body;
         int nv;          int nv;
           int len;
         int sugar;          int sugar;
 } *ND;  } *ND;
   
 typedef struct oNDV {  typedef struct oNDV {
         struct oNMV *body;          struct oNMV *body;
         int nv;          int nv;
         int sugar;  
         int len;          int len;
           int sugar;
 } *NDV;  } *NDV;
   
 typedef struct oNM {  typedef struct oNM {
Line 110  extern int Top,Reverse;
Line 110  extern int Top,Reverse;
 ((r)=(RHist)MALLOC(sizeof(struct oRHist)+(nd_wpd-1)*sizeof(unsigned int)))  ((r)=(RHist)MALLOC(sizeof(struct oRHist)+(nd_wpd-1)*sizeof(unsigned int)))
 #define NEWND_pairs(m) if(!_ndp_free_list)_NDP_alloc(); (m)=_ndp_free_list; _ndp_free_list = NEXT(_ndp_free_list)  #define NEWND_pairs(m) if(!_ndp_free_list)_NDP_alloc(); (m)=_ndp_free_list; _ndp_free_list = NEXT(_ndp_free_list)
 #define NEWNM(m) if(!_nm_free_list)_NM_alloc(); (m)=_nm_free_list; _nm_free_list = NEXT(_nm_free_list)  #define NEWNM(m) if(!_nm_free_list)_NM_alloc(); (m)=_nm_free_list; _nm_free_list = NEXT(_nm_free_list)
 #define MKND(n,m,d) if(!_nd_free_list)_ND_alloc(); (d)=_nd_free_list; _nd_free_list = (ND)BDY(_nd_free_list); (d)->nv=(n); BDY(d)=(m)  #define MKND(n,m,len,d) if(!_nd_free_list)_ND_alloc(); (d)=_nd_free_list; _nd_free_list = (ND)BDY(_nd_free_list); NV(d)=(n); LEN(d)=(len); BDY(d)=(m)
   
 #define NEXTRHist(r,c) \  #define NEXTRHist(r,c) \
 if(!(r)){NEWRHist(r);(c)=(r);}else{NEWRHist(NEXT(c));(c)=NEXT(c);}  if(!(r)){NEWRHist(r);(c)=(r);}else{NEWRHist(NEXT(c));(c)=NEXT(c);}
Line 135  void nd_mul_c_q(ND p,Q mul);
Line 135  void nd_mul_c_q(ND p,Q mul);
 ND normalize_pbucket(int mod,PGeoBucket g);  ND normalize_pbucket(int mod,PGeoBucket g);
 int head_pbucket(int mod,PGeoBucket g);  int head_pbucket(int mod,PGeoBucket g);
 int head_pbucket_q(PGeoBucket g);  int head_pbucket_q(PGeoBucket g);
 void add_pbucket(int mod,PGeoBucket g,ND d,int l);  void add_pbucket(int mod,PGeoBucket g,ND d);
 void free_pbucket(PGeoBucket b);  void free_pbucket(PGeoBucket b);
 void mulq_pbucket(PGeoBucket g,Q c);  void mulq_pbucket(PGeoBucket g,Q c);
 PGeoBucket create_pbucket();  PGeoBucket create_pbucket();
Line 168  void _NM_alloc();
Line 168  void _NM_alloc();
 void _ND_alloc();  void _ND_alloc();
 int ndl_td(unsigned int *d);  int ndl_td(unsigned int *d);
 int ndl_dehomogenize(unsigned int *p);  int ndl_dehomogenize(unsigned int *p);
 ND nd_add(int mod,ND p1,ND p2,int *cancel);  ND nd_add(int mod,ND p1,ND p2);
 ND nd_add_q(ND p1,ND p2,int *cancel);  ND nd_add_q(ND p1,ND p2);
 ND nd_mul_nm(int mod,ND p,NM m0);  ND nd_mul_nm(int mod,ND p,NM m0);
 ND nd_mul_ind_nm(int mod,int index,NM m0);  ND nd_mul_ind_nm(int mod,int index,NM m0);
 int nd_sp(int mod,ND_pairs p,ND *nf);  int nd_sp(int mod,ND_pairs p,ND *nf);
Line 344  int ndl_dehomogenize(unsigned int *d)
Line 344  int ndl_dehomogenize(unsigned int *d)
 {  {
         unsigned int mask;          unsigned int mask;
         unsigned int h;          unsigned int h;
         int i;          int i,bits;
   
         if ( is_rlex ) {          if ( is_rlex ) {
                 if ( nd_bpe == 32 ) {                  if ( nd_bpe == 32 ) {
Line 354  int ndl_dehomogenize(unsigned int *d)
Line 354  int ndl_dehomogenize(unsigned int *d)
                         d[i-1] = 0;                          d[i-1] = 0;
                         return h;                          return h;
                 } else {                  } else {
                         mask = (1<<(nd_epw*nd_bpe))-1;                          bits = nd_epw*nd_bpe;
                           mask = bits==32?0xffffffff:((1<<(nd_epw*nd_bpe))-1);
                         h = (d[0]>>((nd_epw-1)*nd_bpe))&nd_mask0;                          h = (d[0]>>((nd_epw-1)*nd_bpe))&nd_mask0;
                         for ( i = 0; i < nd_wpd; i++ )                          for ( i = 0; i < nd_wpd; i++ )
                                 d[i] = ((d[i]<<nd_bpe)&mask)                                  d[i] = ((d[i]<<nd_bpe)&mask)
Line 784  INLINE int nd_find_reducer(ND g)
Line 785  INLINE int nd_find_reducer(ND g)
   
 INLINE int nd_find_reducer_direct(ND g,NDV *ps,int len)  INLINE int nd_find_reducer_direct(ND g,NDV *ps,int len)
 {  {
         int i;  
         NDV r;          NDV r;
           RHist s;
           int d,k,i;
   
         if ( Reverse )          if ( Reverse )
                 for ( i = len-1; i >= 0; i-- ) {                  for ( i = len-1; i >= 0; i-- ) {
Line 806  INLINE int nd_find_reducer_direct(ND g,NDV *ps,int len
Line 808  INLINE int nd_find_reducer_direct(ND g,NDV *ps,int len
         return -1;          return -1;
 }  }
   
 ND nd_add(int mod,ND p1,ND p2,int *cancel)  ND nd_add(int mod,ND p1,ND p2)
 {  {
         int n,c;          int n,c;
         int t,can;          int t,can;
         ND r;          ND r;
         NM m1,m2,mr0,mr,s;          NM m1,m2,mr0,mr,s;
   
         if ( !p1 ) {          if ( !p1 )
                 *cancel = 0;  
                 return p2;                  return p2;
         } else if ( !p2 ) {          else if ( !p2 )
                 *cancel = 0;  
                 return p1;                  return p1;
         } else if ( !mod )          else if ( !mod )
                 return nd_add_q(p1,p2,cancel);                  return nd_add_q(p1,p2);
         else {          else {
                 can = 0;                  can = 0;
                 for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; ) {                  for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; ) {
Line 853  ND nd_add(int mod,ND p1,ND p2,int *cancel)
Line 853  ND nd_add(int mod,ND p1,ND p2,int *cancel)
                                         break;                                          break;
                         }                          }
                 }                  }
                 *cancel = can;  
                 if ( !mr0 )                  if ( !mr0 )
                         if ( m1 )                          if ( m1 )
                                 mr0 = m1;                                  mr0 = m1;
Line 869  ND nd_add(int mod,ND p1,ND p2,int *cancel)
Line 868  ND nd_add(int mod,ND p1,ND p2,int *cancel)
                         NEXT(mr) = 0;                          NEXT(mr) = 0;
                 BDY(p1) = mr0;                  BDY(p1) = mr0;
                 SG(p1) = MAX(SG(p1),SG(p2));                  SG(p1) = MAX(SG(p1),SG(p2));
                   LEN(p1) = LEN(p1)+LEN(p2)-can;
                 FREEND(p2);                  FREEND(p2);
                 return p1;                  return p1;
         }          }
 }  }
   
 ND nd_add_q(ND p1,ND p2,int *cancel)  ND nd_add_q(ND p1,ND p2)
 {  {
         int n,c,can;          int n,c,can;
         ND r;          ND r;
         NM m1,m2,mr0,mr,s;          NM m1,m2,mr0,mr,s;
         Q t;          Q t;
   
         if ( !p1 ) {          if ( !p1 )
                 *cancel = 0;  
                 return p2;                  return p2;
         } else if ( !p2 ) {          else if ( !p2 )
                 *cancel = 0;  
                 return p1;                  return p1;
         } else {          else {
                 can = 0;                  can = 0;
                 for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; ) {                  for ( n = NV(p1), m1 = BDY(p1), m2 = BDY(p2), mr0 = 0; m1 && m2; ) {
                         if ( TD(m1) > TD(m2) )                          if ( TD(m1) > TD(m2) )
Line 917  ND nd_add_q(ND p1,ND p2,int *cancel)
Line 915  ND nd_add_q(ND p1,ND p2,int *cancel)
                                         break;                                          break;
                         }                          }
                 }                  }
                 *cancel = can;  
                 if ( !mr0 )                  if ( !mr0 )
                         if ( m1 )                          if ( m1 )
                                 mr0 = m1;                                  mr0 = m1;
Line 933  ND nd_add_q(ND p1,ND p2,int *cancel)
Line 930  ND nd_add_q(ND p1,ND p2,int *cancel)
                         NEXT(mr) = 0;                          NEXT(mr) = 0;
                 BDY(p1) = mr0;                  BDY(p1) = mr0;
                 SG(p1) = MAX(SG(p1),SG(p2));                  SG(p1) = MAX(SG(p1),SG(p2));
                   LEN(p1) = LEN(p1)+LEN(p2)-can;
                 FREEND(p2);                  FREEND(p2);
                 return p1;                  return p1;
         }          }
Line 986  int nd_nf(int mod,ND g,int full,ND *rp)
Line 984  int nd_nf(int mod,ND g,int full,ND *rp)
                                 chsgnq(cg,&CQ(mul));                                  chsgnq(cg,&CQ(mul));
                                 nd_mul_c_q(d,cred); nd_mul_c_q(g,cred);                                  nd_mul_c_q(d,cred); nd_mul_c_q(g,cred);
                         }                          }
                         g = nd_add(mod,g,ndv_mul_nm(mod,p,mul),&dummy);                          g = nd_add(mod,g,ndv_mul_nm(mod,p,mul));
                         sugar = MAX(sugar,SG(p)+TD(mul));                          sugar = MAX(sugar,SG(p)+TD(mul));
                         if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) {                          if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) {
                                 nd_removecont2(d,g);                                  nd_removecont2(d,g);
Line 1000  afo:
Line 998  afo:
                         m = BDY(g);                          m = BDY(g);
                         if ( NEXT(m) ) {                          if ( NEXT(m) ) {
                                 BDY(g) = NEXT(m); NEXT(m) = 0;                                  BDY(g) = NEXT(m); NEXT(m) = 0;
                                   LEN(g)--;
                         } else {                          } else {
                                 FREEND(g); g = 0;                                  FREEND(g); g = 0;
                         }                          }
                         if ( d ) {                          if ( d ) {
                                 NEXT(tail)=m;                                  NEXT(tail)=m;
                                 tail=m;                                  tail=m;
                                   LEN(d)++;
                         } else {                          } else {
                                 MKND(n,m,d);                                  MKND(n,m,1,d);
                                 tail = BDY(d);                                  tail = BDY(d);
                         }                          }
                 }                  }
Line 1024  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
Line 1024  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
         NDV p;          NDV p;
         ND u,d,red;          ND u,d,red;
         NODE l;          NODE l;
         NM mul,m,mrd;          NM mul,m,mrd,tail;
         int sugar,psugar,n,h_reducible;          int sugar,psugar,n,h_reducible;
         PGeoBucket bucket;          PGeoBucket bucket;
         int c,c1,c2;          int c,c1,c2;
Line 1041  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
Line 1041  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
         if ( !mod )          if ( !mod )
                 hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;                  hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;
         bucket = create_pbucket();          bucket = create_pbucket();
         add_pbucket(mod,bucket,g,nd_length(g));          add_pbucket(mod,bucket,g);
         d = 0;          d = 0;
         mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int));          mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int));
         while ( 1 ) {          while ( 1 ) {
Line 1079  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
Line 1079  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
                         }                          }
                         red = ndv_mul_nm(mod,p,mul);                          red = ndv_mul_nm(mod,p,mul);
                         bucket->body[hindex] = nd_remove_head(g);                          bucket->body[hindex] = nd_remove_head(g);
                         bucket->len[hindex]--;  
                         red = nd_remove_head(red);                          red = nd_remove_head(red);
                         add_pbucket(mod,bucket,red,LEN(p)-1);                          add_pbucket(mod,bucket,red);
                         sugar = MAX(sugar,SG(p)+TD(mul));                          sugar = MAX(sugar,SG(p)+TD(mul));
                         if ( !mod && hmag && (gmag > hmag) ) {                          if ( !mod && hmag && (gmag > hmag) ) {
                                 g = normalize_pbucket(mod,bucket);                                  g = normalize_pbucket(mod,bucket);
Line 1093  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
Line 1092  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
                                 }                                  }
                                 nd_removecont2(d,g);                                  nd_removecont2(d,g);
                                 hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;                                  hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;
                                 add_pbucket(mod,bucket,g,nd_length(g)-1);                                  add_pbucket(mod,bucket,g);
                         }                          }
                 } else if ( !full ) {                  } else if ( !full ) {
                         g = normalize_pbucket(mod,bucket);                          g = normalize_pbucket(mod,bucket);
Line 1105  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
Line 1104  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
                         m = BDY(g);                          m = BDY(g);
                         if ( NEXT(m) ) {                          if ( NEXT(m) ) {
                                 BDY(g) = NEXT(m); NEXT(m) = 0;                                  BDY(g) = NEXT(m); NEXT(m) = 0;
                                   LEN(g)--;
                         } else {                          } else {
                                 FREEND(g); g = 0;                                  FREEND(g); g = 0;
                         }                          }
                         bucket->body[hindex] = g;                          bucket->body[hindex] = g;
                         bucket->len[hindex]--;  
                         NEXT(m) = 0;                          NEXT(m) = 0;
                         if ( d ) {                          if ( d ) {
                                 for ( mrd = BDY(d); NEXT(mrd); mrd = NEXT(mrd) );                                  NEXT(tail)=m;
                                 NEXT(mrd) = m;                                  tail=m;
                                   LEN(d)++;
                         } else {                          } else {
                                 MKND(n,m,d);                                  MKND(n,m,1,d);
                                   tail = BDY(d);
                         }                          }
                 }                  }
         }          }
Line 1127  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
Line 1128  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
         NM m,mrd,tail;          NM m,mrd,tail;
         NM mul;          NM mul;
         int n,sugar,psugar,sugar0,stat,index;          int n,sugar,psugar,sugar0,stat,index;
         int c,c1,c2,dummy;          int c,c1,c2;
         RHist h;          RHist h;
         NDV p,red;          NDV p,red;
         Q cg,cred,gcd;          Q cg,cred,gcd;
Line 1166  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
Line 1167  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
                                 chsgnq(cg,&CQ(mul));                                  chsgnq(cg,&CQ(mul));
                                 nd_mul_c_q(d,cred); nd_mul_c_q(g,cred);                                  nd_mul_c_q(d,cred); nd_mul_c_q(g,cred);
                         }                          }
                         g = nd_add(mod,g,ndv_mul_nm(mod,p,mul),&dummy);                          g = nd_add(mod,g,ndv_mul_nm(mod,p,mul));
                         sugar = MAX(sugar,SG(p)+TD(mul));                          sugar = MAX(sugar,SG(p)+TD(mul));
                         if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) {                          if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) {
                                 nd_removecont2(d,g);                                  nd_removecont2(d,g);
Line 1179  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
Line 1180  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
                         m = BDY(g);                          m = BDY(g);
                         if ( NEXT(m) ) {                          if ( NEXT(m) ) {
                                 BDY(g) = NEXT(m); NEXT(m) = 0;                                  BDY(g) = NEXT(m); NEXT(m) = 0;
                                   LEN(g)--;
                         } else {                          } else {
                                 FREEND(g); g = 0;                                  FREEND(g); g = 0;
                         }                          }
                         if ( d ) {                          if ( d ) {
                                 NEXT(tail)=m;                                  NEXT(tail)=m;
                                 tail=m;                                  tail=m;
                                   LEN(d)++;
                         } else {                          } else {
                                 MKND(n,m,d);                                  MKND(n,m,1,d);
                                 tail = BDY(d);                                  tail = BDY(d);
                         }                          }
                 }                  }
Line 1203  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
Line 1206  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
         NDV p;          NDV p;
         ND u,d,red;          ND u,d,red;
         NODE l;          NODE l;
         NM mul,m,mrd;          NM mul,m,mrd,tail;
         int sugar,psugar,n,h_reducible;          int sugar,psugar,n,h_reducible;
         PGeoBucket bucket;          PGeoBucket bucket;
         int c,c1,c2;          int c,c1,c2;
Line 1225  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
Line 1228  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
         hmag = 0;          hmag = 0;
 #endif  #endif
         bucket = create_pbucket();          bucket = create_pbucket();
         add_pbucket(mod,bucket,g,nd_length(g));          add_pbucket(mod,bucket,g);
         d = 0;          d = 0;
         mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int));          mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int));
         while ( 1 ) {          while ( 1 ) {
Line 1261  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
Line 1264  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
                         }                          }
                         red = ndv_mul_nm(mod,p,mul);                          red = ndv_mul_nm(mod,p,mul);
                         bucket->body[hindex] = nd_remove_head(g);                          bucket->body[hindex] = nd_remove_head(g);
                         bucket->len[hindex]--;  
                         red = nd_remove_head(red);                          red = nd_remove_head(red);
                         add_pbucket(mod,bucket,red,LEN(p)-1);                          add_pbucket(mod,bucket,red);
                         sugar = MAX(sugar,SG(p)+TD(mul));                          sugar = MAX(sugar,SG(p)+TD(mul));
                         if ( !mod && hmag && (gmag > hmag) ) {                          if ( !mod && hmag && (gmag > hmag) ) {
                                 g = normalize_pbucket(mod,bucket);                                  g = normalize_pbucket(mod,bucket);
Line 1275  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
Line 1277  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
                                 }                                  }
                                 nd_removecont2(d,g);                                  nd_removecont2(d,g);
                                 hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;                                  hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;
                                 add_pbucket(mod,bucket,g,nd_length(g)-1);                                  add_pbucket(mod,bucket,g);
                         }                          }
                 } else if ( !full ) {                  } else if ( !full ) {
                         g = normalize_pbucket(mod,bucket);                          g = normalize_pbucket(mod,bucket);
Line 1287  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
Line 1289  int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,
                         m = BDY(g);                          m = BDY(g);
                         if ( NEXT(m) ) {                          if ( NEXT(m) ) {
                                 BDY(g) = NEXT(m); NEXT(m) = 0;                                  BDY(g) = NEXT(m); NEXT(m) = 0;
                                   LEN(g)--;
                         } else {                          } else {
                                 FREEND(g); g = 0;                                  FREEND(g); g = 0;
                         }                          }
                         bucket->body[hindex] = g;                          bucket->body[hindex] = g;
                         bucket->len[hindex]--;  
                         NEXT(m) = 0;                          NEXT(m) = 0;
                         if ( d ) {                          if ( d ) {
                                 for ( mrd = BDY(d); NEXT(mrd); mrd = NEXT(mrd) );                                  NEXT(tail)=m;
                                 NEXT(mrd) = m;                                  tail=m;
                                   LEN(d)++;
                         } else {                          } else {
                                 MKND(n,m,d);                                  MKND(n,m,1,d);
                                   tail = BDY(d);
                         }                          }
                 }                  }
         }          }
Line 1312  int nd_check_candidate(NODE input,NODE cand)
Line 1316  int nd_check_candidate(NODE input,NODE cand)
         NODE t;          NODE t;
   
         nd_setup(0,cand);          nd_setup(0,cand);
           n = length(cand);
   
         /* membercheck : list is a subset of Id(cand) ? */          /* membercheck : list is a subset of Id(cand) ? */
         for ( t = input; t; t = NEXT(t) ) {          for ( t = input; t; t = NEXT(t) ) {
Line 1337  ND nd_remove_head(ND p)
Line 1342  ND nd_remove_head(ND p)
         if ( !NEXT(m) ) {          if ( !NEXT(m) ) {
                 FREEND(p);                  FREEND(p);
                 p = 0;                  p = 0;
         } else          } else {
                 BDY(p) = NEXT(m);                  BDY(p) = NEXT(m);
                   LEN(p)--;
           }
         FREENM(m);          FREENM(m);
         return p;          return p;
 }  }
Line 1359  void free_pbucket(PGeoBucket b) {
Line 1366  void free_pbucket(PGeoBucket b) {
                 if ( b->body[i] ) {                  if ( b->body[i] ) {
                         nd_free(b->body[i]);                          nd_free(b->body[i]);
                         b->body[i] = 0;                          b->body[i] = 0;
                         b->len[i] = 0;  
                 }                  }
         GC_free(b);          GC_free(b);
 }  }
   
 void add_pbucket(int mod,PGeoBucket g,ND d,int l)  void add_pbucket(int mod,PGeoBucket g,ND d)
 {  {
         int i,k,m,cancel;          int l,i,k,m;
   
           if ( !d )
                   return;
           l = LEN(d);
         for ( k = 0, m = 1; l > m; k++, m <<= 1 );          for ( k = 0, m = 1; l > m; k++, m <<= 1 );
         /* 2^(k-1) < l <= 2^k (=m) */          /* 2^(k-1) < l <= 2^k (=m) */
         d = nd_add(mod,g->body[k],d,&cancel);          d = nd_add(mod,g->body[k],d);
         l = g->len[k]+l-cancel;          for ( ; d && LEN(d) > m; k++, m <<= 1 ) {
         for ( ; d && l > m; k++, m <<= 1 ) {  
                 g->body[k] = 0;                  g->body[k] = 0;
                 g->len[k] = 0;                  d = nd_add(mod,g->body[k+1],d);
                 d = nd_add(mod,g->body[k+1],d,&cancel);  
                 l = g->len[k+1]+l-cancel;  
         }          }
         g->body[k] = d;          g->body[k] = d;
         g->len[k] = l;  
         g->m = MAX(g->m,k);          g->m = MAX(g->m,k);
 }  }
   
Line 1421  int head_pbucket(int mod,PGeoBucket g)
Line 1426  int head_pbucket(int mod,PGeoBucket g)
                                 if ( c > 0 ) {                                  if ( c > 0 ) {
                                         if ( sum )                                          if ( sum )
                                                 HCM(gj) = sum;                                                  HCM(gj) = sum;
                                         else {                                          else
                                                 g->body[j] = nd_remove_head(gj);                                                  g->body[j] = nd_remove_head(gj);
                                                 g->len[j]--;  
                                         }  
                                         j = i;                                          j = i;
                                         gj = g->body[j];                                          gj = g->body[j];
                                         dj = HDL(gj);                                          dj = HDL(gj);
Line 1434  int head_pbucket(int mod,PGeoBucket g)
Line 1437  int head_pbucket(int mod,PGeoBucket g)
                                         if ( sum < 0 )                                          if ( sum < 0 )
                                                 sum += mod;                                                  sum += mod;
                                         g->body[i] = nd_remove_head(gi);                                          g->body[i] = nd_remove_head(gi);
                                         g->len[i]--;  
                                 }                                  }
                         }                          }
                 }                  }
Line 1443  int head_pbucket(int mod,PGeoBucket g)
Line 1445  int head_pbucket(int mod,PGeoBucket g)
                 else if ( sum ) {                  else if ( sum ) {
                         HCM(gj) = sum;                          HCM(gj) = sum;
                         return j;                          return j;
                 } else {                  } else
                         g->body[j] = nd_remove_head(gj);                          g->body[j] = nd_remove_head(gj);
                         g->len[j]--;  
                 }  
         }          }
 }  }
   
Line 1480  int head_pbucket_q(PGeoBucket g)
Line 1480  int head_pbucket_q(PGeoBucket g)
                                 if ( c > 0 ) {                                  if ( c > 0 ) {
                                         if ( sum )                                          if ( sum )
                                                 HCQ(gj) = sum;                                                  HCQ(gj) = sum;
                                         else {                                          else
                                                 g->body[j] = nd_remove_head(gj);                                                  g->body[j] = nd_remove_head(gj);
                                                 g->len[j]--;  
                                         }  
                                         j = i;                                          j = i;
                                         gj = g->body[j];                                          gj = g->body[j];
                                         dj = HDL(gj);                                          dj = HDL(gj);
Line 1492  int head_pbucket_q(PGeoBucket g)
Line 1490  int head_pbucket_q(PGeoBucket g)
                                         addq(sum,HCQ(gi),&t);                                          addq(sum,HCQ(gi),&t);
                                         sum = t;                                          sum = t;
                                         g->body[i] = nd_remove_head(gi);                                          g->body[i] = nd_remove_head(gi);
                                         g->len[i]--;  
                                 }                                  }
                         }                          }
                 }                  }
Line 1501  int head_pbucket_q(PGeoBucket g)
Line 1498  int head_pbucket_q(PGeoBucket g)
                 else if ( sum ) {                  else if ( sum ) {
                         HCQ(gj) = sum;                          HCQ(gj) = sum;
                         return j;                          return j;
                 } else {                  } else
                         g->body[j] = nd_remove_head(gj);                          g->body[j] = nd_remove_head(gj);
                         g->len[j]--;  
                 }  
         }          }
 }  }
   
 ND normalize_pbucket(int mod,PGeoBucket g)  ND normalize_pbucket(int mod,PGeoBucket g)
 {  {
         int i,dummy;          int i;
         ND r,t;          ND r,t;
   
         r = 0;          r = 0;
         for ( i = 0; i <= g->m; i++ ) {          for ( i = 0; i <= g->m; i++ ) {
                 r = nd_add(mod,r,g->body[i],&dummy);                  r = nd_add(mod,r,g->body[i]);
                 g->body[i] = 0;                  g->body[i] = 0;
                 g->len[i] = 0;  
         }          }
         g->m = -1;          g->m = -1;
         return r;          return r;
Line 1947  ND_pairs nd_minp( ND_pairs d, ND_pairs *prest )
Line 1941  ND_pairs nd_minp( ND_pairs d, ND_pairs *prest )
                                 c = ndl_compare(p->lcm,lcm);                                  c = ndl_compare(p->lcm,lcm);
                                 if ( c < 0 )                                  if ( c < 0 )
                                         goto find;                                          goto find;
 #if 0  
                                 else if ( c == 0 ) {  
                                         tlen = nd_psl[p->i1]+nd_psl[p->i2];  
                                         if ( tlen < len )  
                                                 goto find;  
                                 }  
 #endif  
                         }                          }
                 }                  }
                 continue;                  continue;
Line 2307  ND dptond(int mod,DP p)
Line 2294  ND dptond(int mod,DP p)
         ND d;          ND d;
         NM m0,m;          NM m0,m;
         MP t;          MP t;
         int n;          int n,l;
   
         if ( !p )          if ( !p )
                 return 0;                  return 0;
         n = NV(p);          n = NV(p);
         m0 = 0;          m0 = 0;
         for ( t = BDY(p); t; t = NEXT(t) ) {          for ( t = BDY(p), l = 0; t; t = NEXT(t), l++ ) {
                 NEXTNM(m0,m);                  NEXTNM(m0,m);
                 if ( mod )                  if ( mod )
                         CM(m) = ITOS(C(t));                          CM(m) = ITOS(C(t));
Line 2323  ND dptond(int mod,DP p)
Line 2310  ND dptond(int mod,DP p)
                 dltondl(n,DL(t),DL(m));                  dltondl(n,DL(t),DL(m));
         }          }
         NEXT(m) = 0;          NEXT(m) = 0;
         MKND(n,m0,d);          MKND(n,m0,l,d);
         NV(d) = n;  
         SG(d) = SG(p);          SG(d) = SG(p);
         return d;          return d;
 }  }
Line 2779  void nd_reconstruct_direct(int mod,NDV *ps,int len)
Line 2765  void nd_reconstruct_direct(int mod,NDV *ps,int len)
         if ( mod != 0 )          if ( mod != 0 )
                 for ( i = len-1; i >= 0; i-- )                  for ( i = len-1; i >= 0; i-- )
                         ndv_realloc(ps[i],obpe,oadv);                          ndv_realloc(ps[i],obpe,oadv);
           for ( i = 0; i < REDTAB_LEN; i++ ) {
                   for ( mr0 = 0, r = nd_red[i]; r; r = NEXT(r) ) {
                           NEXTRHist(mr0,mr);
                           mr->index = r->index;
                           SG(mr) = SG(r);
                           TD(mr) = TD(r);
                           ndl_dup(obpe,DL(r),DL(mr));
                   }
                   if ( mr0 ) NEXT(mr) = 0;
                   nd_red[i] = mr0;
           }
         prev_nm_free_list = 0;          prev_nm_free_list = 0;
         prev_ndp_free_list = 0;          prev_ndp_free_list = 0;
         GC_gcollect();          GC_gcollect();
Line 2842  ND nd_copy(ND p)
Line 2839  ND nd_copy(ND p)
                         ndl_copy(DL(m),DL(mr));                          ndl_copy(DL(m),DL(mr));
                 }                  }
                 NEXT(mr) = 0;                  NEXT(mr) = 0;
                 MKND(NV(p),mr0,r);                  MKND(NV(p),mr0,LEN(p),r);
                 SG(r) = SG(p);                  SG(r) = SG(p);
                 return r;                  return r;
         }          }
Line 2854  int nd_sp(int mod,ND_pairs p,ND *rp)
Line 2851  int nd_sp(int mod,ND_pairs p,ND *rp)
         NDV p1,p2;          NDV p1,p2;
         ND t1,t2;          ND t1,t2;
         unsigned int *lcm;          unsigned int *lcm;
         int td,dummy;          int td;
   
         if ( mod ) {          if ( mod ) {
                 p1 = nd_ps[p->i1]; p2 = nd_ps[p->i2];                  p1 = nd_ps[p->i1]; p2 = nd_ps[p->i2];
Line 2879  int nd_sp(int mod,ND_pairs p,ND *rp)
Line 2876  int nd_sp(int mod,ND_pairs p,ND *rp)
                 return 0;                  return 0;
         }          }
         t2 = ndv_mul_nm(mod,p2,m);          t2 = ndv_mul_nm(mod,p2,m);
         *rp = nd_add(mod,t1,t2,&dummy);          *rp = nd_add(mod,t1,t2);
         FREENM(m);          FREENM(m);
         return 1;          return 1;
 }  }
Line 2949  ND ndv_mul_nm(int mod,NDV p,NM m0)
Line 2946  ND ndv_mul_nm(int mod,NDV p,NM m0)
                         }                          }
                 }                  }
                 NEXT(mr) = 0;                  NEXT(mr) = 0;
                 MKND(NV(p),mr0,r);                  MKND(NV(p),mr0,len,r);
                 SG(r) = SG(p) + td;                  SG(r) = SG(p) + td;
                 return r;                  return r;
         }          }
Line 2994  NDV ndtondv(int mod,ND p)
Line 2991  NDV ndtondv(int mod,ND p)
   
         if ( !p )          if ( !p )
                 return 0;                  return 0;
         len = nd_length(p);          len = LEN(p);
         if ( mod )          if ( mod )
                 m0 = m = (NMV)MALLOC_ATOMIC(len*nmv_adv);                  m0 = m = (NMV)MALLOC_ATOMIC(len*nmv_adv);
         else          else
Line 3027  ND ndvtond(int mod,NDV p)
Line 3024  ND ndvtond(int mod,NDV p)
                 CQ(m) = CQ(t);                  CQ(m) = CQ(t);
         }          }
         NEXT(m) = 0;          NEXT(m) = 0;
         MKND(NV(p),m0,d);          MKND(NV(p),m0,len,d);
         SG(d) = SG(p);          SG(d) = SG(p);
         return d;          return d;
 }  }

Legend:
Removed from v.1.30  
changed lines
  Added in v.1.31

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>