[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.29 and 1.33

version 1.29, 2003/08/11 07:37:08 version 1.33, 2003/08/19 05:29:11
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.28 2003/08/11 06:58:01 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.32 2003/08/19 04:38:09 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "inline.h"  #include "inline.h"
Line 23  typedef struct oPGeoBucket {
Line 23  typedef struct oPGeoBucket {
 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 66  typedef struct oND_pairs {
Line 67  typedef struct oND_pairs {
         unsigned int lcm[1];          unsigned int lcm[1];
 } *ND_pairs;  } *ND_pairs;
   
   int (*nm_compare_function)(NM a,NM b);
   int (*nmv_compare_function)(NMV a,NMV b);
   int (*ndp_compare_function)(ND_pairs a,ND_pairs b);
   
 double nd_scale=2;  double nd_scale=2;
 static unsigned int **nd_bound;  static unsigned int **nd_bound;
 int nd_nvar;  int nd_nvar;
 int is_rlex;  int nd_isrlex;
 int nd_epw,nd_bpe,nd_wpd;  int nd_epw,nd_bpe,nd_wpd;
 unsigned int nd_mask[32];  unsigned int nd_mask[32];
 unsigned int nd_mask0,nd_mask1;  unsigned int nd_mask0,nd_mask1;
Line 80  ND_pairs _ndp_free_list;
Line 85  ND_pairs _ndp_free_list;
   
 static NDV *nd_ps;  static NDV *nd_ps;
 static NDV *nd_psq;  static NDV *nd_psq;
 int *nd_psl;  
 RHist *nd_psh;  RHist *nd_psh;
 int nd_psn,nd_pslen;  int nd_psn,nd_pslen;
   
Line 90  int nd_red_len;
Line 94  int nd_red_len;
 int nd_found,nd_create,nd_notfirst;  int nd_found,nd_create,nd_notfirst;
 int nm_adv;  int nm_adv;
 int nmv_adv;  int nmv_adv;
   int nd_degcompat;
   
 extern int Top,Reverse;  extern int Top,Reverse;
   
Line 103  extern int Top,Reverse;
Line 108  extern int Top,Reverse;
 #define TD(a) ((a)->td)  #define TD(a) ((a)->td)
 #define SG(a) ((a)->sugar)  #define SG(a) ((a)->sugar)
 #define LEN(a) ((a)->len)  #define LEN(a) ((a)->len)
   #define LCM(a) ((a)->lcm)
   
   #define NM_COMPARE(m1,m2)\
   (nd_degcompat?(TD(m1)>TD(m2)?1\
                              :(TD(m1)<TD(m2)?-1:ndl_compare(DL(m1),DL(m2))))\
               :(*nm_compare_function)(m1,m2))
   #define NMV_COMPARE(m1,m2)\
   (nd_degcompat?(TD(m1)>TD(m2)?1\
                              :(TD(m1)<TD(m2)?-1:ndl_compare(DL(m1),DL(m2))))\
               :(*nmv_compare_function)(m1,m2))
   #define NDP_COMPARE(m1,m2)\
   (nd_degcompat?(TD(m1)>TD(m2)?1\
                              :(TD(m1)<TD(m2)?-1:ndl_compare(LCM(m1),LCM(m2))))\
               :(*ndp_compare_function)(m1,m2))
 #define NM_ADV(m) (m = (NM)(((char *)m)+nm_adv))  #define NM_ADV(m) (m = (NM)(((char *)m)+nm_adv))
 #define NEWRHist(r) \  #define NEWRHist(r) \
 ((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 124  if(!(r)){(c)=(r)=(s);}else{NEXT(c)=(s);(c)=(s);}
Line 142  if(!(r)){(c)=(r)=(s);}else{NEXT(c)=(s);(c)=(s);}
 #define NEXTND_pairs(r,c) \  #define NEXTND_pairs(r,c) \
 if(!(r)){NEWND_pairs(r);(c)=(r);}else{NEWND_pairs(NEXT(c));(c)=NEXT(c);}  if(!(r)){NEWND_pairs(r);(c)=(r);}else{NEWND_pairs(NEXT(c));(c)=NEXT(c);}
   
   void nd_init_ord(struct order_spec *spec);
 int nd_check_candidate(NODE input,NODE cand);  int nd_check_candidate(NODE input,NODE cand);
 void nd_removecont(int mod,ND p);  void nd_removecont(int mod,ND p);
 void nd_removecont2(ND p1,ND p2);  void nd_removecont2(ND p1,ND p2);
Line 134  void nd_mul_c_q(ND p,Q mul);
Line 153  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 175  int nd_sp(int mod,ND_pairs p,ND *nf);
Line 194  int nd_sp(int mod,ND_pairs p,ND *nf);
 int nd_find_reducer(ND g);  int nd_find_reducer(ND g);
 int nd_find_reducer_direct(ND g,NDV *ps,int len);  int nd_find_reducer_direct(ND g,NDV *ps,int len);
 int nd_nf(int mod,ND g,int full,ND *nf);  int nd_nf(int mod,ND g,int full,ND *nf);
   int nd_nf_pbucket(int mod,ND g,int full,ND *nf);
   int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full,ND *rp);
   int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,int full,ND *rp);
 ND nd_reduce(ND p1,ND p2);  ND nd_reduce(ND p1,ND p2);
 ND nd_reduce_special(ND p1,ND p2);  ND nd_reduce_special(ND p1,ND p2);
 NODE nd_reduceall(int m,NODE f);  NODE nd_reduceall(int m,NODE f);
Line 257  void _NDP_alloc()
Line 279  void _NDP_alloc()
         }          }
 }  }
   
 INLINE nd_length(ND p)  INLINE int nd_length(ND p)
 {  {
         NM m;          NM m;
         int i;          int i;
Line 340  int ndl_dehomogenize(unsigned int *d)
Line 362  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 ( nd_isrlex ) {
                 if ( nd_bpe == 32 ) {                  if ( nd_bpe == 32 ) {
                         h = d[0];                          h = d[0];
                         for ( i = 1; i < nd_wpd; i++ )                          for ( i = 1; i < nd_wpd; i++ )
Line 350  int ndl_dehomogenize(unsigned int *d)
Line 372  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 449  INLINE int ndl_compare(unsigned int *d1,unsigned int *
Line 472  INLINE int ndl_compare(unsigned int *d1,unsigned int *
   
         for ( i = 0; i < nd_wpd; i++, d1++, d2++ )          for ( i = 0; i < nd_wpd; i++, d1++, d2++ )
                 if ( *d1 > *d2 )                  if ( *d1 > *d2 )
                         return is_rlex ? -1 : 1;                          return nd_isrlex ? -1 : 1;
                 else if ( *d1 < *d2 )                  else if ( *d1 < *d2 )
                         return is_rlex ? 1 : -1;                          return nd_isrlex ? 1 : -1;
         return 0;          return 0;
 }  }
   
Line 757  INLINE int nd_find_reducer(ND g)
Line 780  INLINE int nd_find_reducer(ND g)
                         return r->index;                          return r->index;
                 }                  }
         }          }
   
         if ( Reverse )          if ( Reverse )
                 for ( i = nd_psn-1; i >= 0; i-- ) {                  for ( i = nd_psn-1; i >= 0; i-- ) {
                         r = nd_psh[i];                          r = nd_psh[i];
Line 781  INLINE int nd_find_reducer(ND g)
Line 803  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 829  INLINE int nd_find_reducer_direct(ND g,NDV *ps,int len
 ND nd_add(int mod,ND p1,ND p2)  ND nd_add(int mod,ND p1,ND p2)
 {  {
         int n,c;          int n,c;
         int t;          int t,can;
         ND r;          ND r;
         NM m1,m2,mr0,mr,s;          NM m1,m2,mr0,mr,s;
   
Line 817  ND nd_add(int mod,ND p1,ND p2)
Line 840  ND nd_add(int mod,ND p1,ND p2)
         else if ( !mod )          else if ( !mod )
                 return nd_add_q(p1,p2);                  return nd_add_q(p1,p2);
         else {          else {
                   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) )                          c = NM_COMPARE(m1,m2);
                                 c = 1;  
                         else if ( TD(m1) < TD(m2) )  
                                 c = -1;  
                         else  
                                 c = ndl_compare(DL(m1),DL(m2));  
                         switch ( c ) {                          switch ( c ) {
                                 case 0:                                  case 0:
                                         t = ((CM(m1))+(CM(m2))) - mod;                                          t = ((CM(m1))+(CM(m2))) - mod;
Line 831  ND nd_add(int mod,ND p1,ND p2)
Line 850  ND nd_add(int mod,ND p1,ND p2)
                                                 t += mod;                                                  t += mod;
                                         s = m1; m1 = NEXT(m1);                                          s = m1; m1 = NEXT(m1);
                                         if ( t ) {                                          if ( t ) {
                                                   can++;
                                                 NEXTNM2(mr0,mr,s); CM(mr) = (t);                                                  NEXTNM2(mr0,mr,s); CM(mr) = (t);
                                         } else {                                          } else {
                                                   can += 2;
                                                 FREENM(s);                                                  FREENM(s);
                                         }                                          }
                                         s = m2; m2 = NEXT(m2); FREENM(s);                                          s = m2; m2 = NEXT(m2); FREENM(s);
Line 860  ND nd_add(int mod,ND p1,ND p2)
Line 881  ND nd_add(int mod,ND p1,ND p2)
                         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 867  ND nd_add(int mod,ND p1,ND p2)
Line 889  ND nd_add(int mod,ND p1,ND p2)
   
 ND nd_add_q(ND p1,ND p2)  ND nd_add_q(ND p1,ND p2)
 {  {
         int n,c;          int n,c,can;
         ND r;          ND r;
         NM m1,m2,mr0,mr,s;          NM m1,m2,mr0,mr,s;
         Q t;          Q t;
Line 877  ND nd_add_q(ND p1,ND p2)
Line 899  ND nd_add_q(ND p1,ND p2)
         else if ( !p2 )          else if ( !p2 )
                 return p1;                  return p1;
         else {          else {
                   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) )                          c = NM_COMPARE(m1,m2);
                                 c = 1;  
                         else if ( TD(m1) < TD(m2) )  
                                 c = -1;  
                         else  
                                 c = ndl_compare(DL(m1),DL(m2));  
                         switch ( c ) {                          switch ( c ) {
                                 case 0:                                  case 0:
                                         addq(CQ(m1),CQ(m2),&t);                                          addq(CQ(m1),CQ(m2),&t);
                                         s = m1; m1 = NEXT(m1);                                          s = m1; m1 = NEXT(m1);
                                         if ( t ) {                                          if ( t ) {
                                                   can++;
                                                 NEXTNM2(mr0,mr,s); CQ(mr) = (t);                                                  NEXTNM2(mr0,mr,s); CQ(mr) = (t);
                                         } else {                                          } else {
                                                   can += 2;
                                                 FREENM(s);                                                  FREENM(s);
                                         }                                          }
                                         s = m2; m2 = NEXT(m2); FREENM(s);                                          s = m2; m2 = NEXT(m2); FREENM(s);
Line 918  ND nd_add_q(ND p1,ND p2)
Line 938  ND nd_add_q(ND p1,ND p2)
                         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;
         }          }
 }  }
   
 #if !USE_GEOBUCKET  
 /* ret=1 : success, ret=0 : overflow */  /* ret=1 : success, ret=0 : overflow */
 int nd_nf(int mod,ND g,int full,ND *rp)  int nd_nf(int mod,ND g,int full,ND *rp)
 {  {
Line 931  int nd_nf(int mod,ND g,int full,ND *rp)
Line 951  int nd_nf(int mod,ND g,int full,ND *rp)
         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;          int c,c1,c2,dummy;
         RHist h;          RHist h;
         NDV p,red;          NDV p,red;
         Q cg,cred,gcd;          Q cg,cred,gcd;
Line 986  afo:
Line 1006  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 1004  afo:
Line 1026  afo:
         return 1;          return 1;
 }  }
   
 int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full,ND *rp)  int nd_nf_pbucket(int mod,ND g,int full,ND *rp)
 {  {
         ND d;  
         NM m,mrd,tail;  
         NM mul;  
         int n,sugar,psugar,sugar0,stat,index;  
         int c,c1,c2;  
         RHist h;  
         NDV p,red;  
         Q cg,cred,gcd;  
         double hmag;  
   
         if ( !g ) {  
                 *rp = 0;  
                 return 1;  
         }  
 #if 0  
         if ( !mod )  
                 hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;  
 #else  
         /* XXX */  
         hmag = 0;  
 #endif  
   
         sugar0 = sugar = SG(g);  
         n = NV(g);  
         mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int));  
         for ( d = 0; g; ) {  
                 index = nd_find_reducer_direct(g,ps,len);  
                 if ( index >= 0 ) {  
                         p = ps[index];  
                         ndl_sub(HDL(g),HDL(p),DL(mul));  
                         TD(mul) = HTD(g)-HTD(p);  
                         if ( ndl_check_bound2_direct(HDL(p),DL(mul)) ) {  
                                 nd_free(g); nd_free(d);  
                                 return 0;  
                         }  
                         if ( mod ) {  
                                 c1 = invm(HCM(p),mod); c2 = mod-HCM(g);  
                                 DMAR(c1,c2,0,mod,c); CM(mul) = c;  
                         } else {  
                                 igcd_cofactor(HCQ(g),HCQ(p),&gcd,&cg,&cred);  
                                 chsgnq(cg,&CQ(mul));  
                                 nd_mul_c_q(d,cred); nd_mul_c_q(g,cred);  
                         }  
                         g = nd_add(mod,g,ndv_mul_nm(mod,p,mul));  
                         sugar = MAX(sugar,SG(p)+TD(mul));  
                         if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) {  
                                 nd_removecont2(d,g);  
                                 hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;  
                         }  
                 } else if ( !full ) {  
                         *rp = g;  
                         return 1;  
                 } else {  
                         m = BDY(g);  
                         if ( NEXT(m) ) {  
                                 BDY(g) = NEXT(m); NEXT(m) = 0;  
                         } else {  
                                 FREEND(g); g = 0;  
                         }  
                         if ( d ) {  
                                 NEXT(tail)=m;  
                                 tail=m;  
                         } else {  
                                 MKND(n,m,d);  
                                 tail = BDY(d);  
                         }  
                 }  
         }  
         if ( d )  
                 SG(d) = sugar;  
         *rp = d;  
         return 1;  
 }  
 #else  
 int nd_nf(int mod,ND g,int full,ND *rp)  
 {  
         int hindex,index;          int hindex,index;
         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 1103  int nd_nf(int mod,ND g,int full,ND *rp)
Line 1049  int nd_nf(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 1142  int nd_nf(int mod,ND g,int full,ND *rp)
Line 1088  int nd_nf(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);
                         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 1154  int nd_nf(int mod,ND g,int full,ND *rp)
Line 1100  int nd_nf(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 1166  int nd_nf(int mod,ND g,int full,ND *rp)
Line 1112  int nd_nf(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;
                         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 1183  int nd_nf(int mod,ND g,int full,ND *rp)
Line 1132  int nd_nf(int mod,ND g,int full,ND *rp)
   
 int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full,ND *rp)  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full,ND *rp)
 {  {
           ND d;
           NM m,mrd,tail;
           NM mul;
           int n,sugar,psugar,sugar0,stat,index;
           int c,c1,c2;
           RHist h;
           NDV p,red;
           Q cg,cred,gcd;
           double hmag;
   
           if ( !g ) {
                   *rp = 0;
                   return 1;
           }
   #if 0
           if ( !mod )
                   hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;
   #else
           /* XXX */
           hmag = 0;
   #endif
   
           sugar0 = sugar = SG(g);
           n = NV(g);
           mul = (NM)ALLOCA(sizeof(struct oNM)+(nd_wpd-1)*sizeof(unsigned int));
           for ( d = 0; g; ) {
                   index = nd_find_reducer_direct(g,ps,len);
                   if ( index >= 0 ) {
                           p = ps[index];
                           ndl_sub(HDL(g),HDL(p),DL(mul));
                           TD(mul) = HTD(g)-HTD(p);
                           if ( ndl_check_bound2_direct(HDL(p),DL(mul)) ) {
                                   nd_free(g); nd_free(d);
                                   return 0;
                           }
                           if ( mod ) {
                                   c1 = invm(HCM(p),mod); c2 = mod-HCM(g);
                                   DMAR(c1,c2,0,mod,c); CM(mul) = c;
                           } else {
                                   igcd_cofactor(HCQ(g),HCQ(p),&gcd,&cg,&cred);
                                   chsgnq(cg,&CQ(mul));
                                   nd_mul_c_q(d,cred); nd_mul_c_q(g,cred);
                           }
                           g = nd_add(mod,g,ndv_mul_nm(mod,p,mul));
                           sugar = MAX(sugar,SG(p)+TD(mul));
                           if ( !mod && hmag && g && ((double)(p_mag((P)HCQ(g))) > hmag) ) {
                                   nd_removecont2(d,g);
                                   hmag = ((double)p_mag((P)HCQ(g)))*nd_scale;
                           }
                   } else if ( !full ) {
                           *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;
                           }
                           if ( d ) {
                                   NEXT(tail)=m;
                                   tail=m;
                                   LEN(d)++;
                           } else {
                                   MKND(n,m,1,d);
                                   tail = BDY(d);
                           }
                   }
           }
           if ( d )
                   SG(d) = sugar;
           *rp = d;
           return 1;
   }
   
   int nd_nf_direct_pbucket(int mod,ND g,NDV *ps,int len,int full,ND *rp)
   {
         int hindex,index;          int hindex,index;
         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 1209  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
Line 1236  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
         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 1246  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
Line 1273  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
                         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);
                         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 1258  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
Line 1285  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
                                 }                                  }
                                 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 1270  int nd_nf_direct(int mod,ND g,NDV *ps,int len,int full
Line 1297  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;
                         }                          }
                         bucket->body[hindex] = g;                          bucket->body[hindex] = g;
                         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);
                         }                          }
                 }                  }
         }          }
 }  }
 #endif  
   
 /* input : list of DP, cand : list of DP */  /* input : list of DP, cand : list of DP */
   
Line 1295  int nd_check_candidate(NODE input,NODE cand)
Line 1324  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 1320  ND nd_remove_head(ND p)
Line 1350  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 1346  void free_pbucket(PGeoBucket b) {
Line 1378  void free_pbucket(PGeoBucket b) {
         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 k,m;          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);          d = nd_add(mod,g->body[k],d);
         for ( ; d && nd_length(d) > m; k++, m <<= 1 ) {          for ( ; d && LEN(d) > m; k++, m <<= 1 ) {
                 g->body[k] = 0;                  g->body[k] = 0;
                 d = nd_add(mod,g->body[k+1],d);                  d = nd_add(mod,g->body[k+1],d);
         }          }
Line 1390  int head_pbucket(int mod,PGeoBucket g)
Line 1425  int head_pbucket(int mod,PGeoBucket g)
                         } else {                          } else {
                                 di = HDL(gi);                                  di = HDL(gi);
                                 nv = NV(gi);                                  nv = NV(gi);
                                 if ( HTD(gi) > HTD(gj) )                                  c = NM_COMPARE(BDY(gi),BDY(gj));
                                         c = 1;  
                                 else if ( HTD(gi) < HTD(gj) )  
                                         c = -1;  
                                 else  
                                         c = ndl_compare(di,dj);  
                                 if ( c > 0 ) {                                  if ( c > 0 ) {
                                         if ( sum )                                          if ( sum )
                                                 HCM(gj) = sum;                                                  HCM(gj) = sum;
Line 1444  int head_pbucket_q(PGeoBucket g)
Line 1474  int head_pbucket_q(PGeoBucket g)
                         } else {                          } else {
                                 di = HDL(gi);                                  di = HDL(gi);
                                 nv = NV(gi);                                  nv = NV(gi);
                                 if ( HTD(gi) > HTD(gj) )                                  c = NM_COMPARE(BDY(gi),BDY(gj));
                                         c = 1;  
                                 else if ( HTD(gi) < HTD(gj) )  
                                         c = -1;  
                                 else  
                                         c = ndl_compare(di,dj);  
                                 if ( c > 0 ) {                                  if ( c > 0 ) {
                                         if ( sum )                                          if ( sum )
                                                 HCQ(gj) = sum;                                                  HCQ(gj) = sum;
Line 1519  again:
Line 1544  again:
                         d = nd_reconstruct(m,0,d);                          d = nd_reconstruct(m,0,d);
                         goto again;                          goto again;
                 }                  }
                 stat = nd_nf(m,h,!Top,&nf);                  stat = m?nd_nf_pbucket(m,h,!Top,&nf):nd_nf(m,h,!Top,&nf);
                 if ( !stat ) {                  if ( !stat ) {
                         NEXT(l) = d; d = l;                          NEXT(l) = d; d = l;
                         d = nd_reconstruct(m,0,d);                          d = nd_reconstruct(m,0,d);
Line 1572  again:
Line 1597  again:
                         d = nd_reconstruct(m,1,d);                          d = nd_reconstruct(m,1,d);
                         goto again;                          goto again;
                 }                  }
                 stat = nd_nf(m,h,!Top,&nf);                  stat = nd_nf_pbucket(m,h,!Top,&nf);
                 if ( !stat ) {                  if ( !stat ) {
                         NEXT(l) = d; d = l;                          NEXT(l) = d; d = l;
                         d = nd_reconstruct(m,1,d);                          d = nd_reconstruct(m,1,d);
Line 1603  again:
Line 1628  again:
   
 int ndv_compare(NDV *p1,NDV *p2)  int ndv_compare(NDV *p1,NDV *p2)
 {  {
         int td1,td2;          return NMV_COMPARE(BDY(*p1),BDY(*p2));
   
         td1 = HTD(*p1); td2 = HTD(*p2);  
         if ( td1 > td2 ) return 1;  
         else if ( td1 < td2 ) return -1;  
         else return ndl_compare(HDL(*p1),HDL(*p2));  
 }  }
   
 int ndv_compare_rev(NDV *p1,NDV *p2)  int ndv_compare_rev(NDV *p1,NDV *p2)
 {  {
         return -ndv_compare(p1,p2);          return -NMV_COMPARE(BDY(*p1),BDY(*p2));
 }  }
   
 NODE nd_reduceall(int m,NODE f)  NODE nd_reduceall(int m,NODE f)
Line 1893  ND_pairs nd_minp( ND_pairs d, ND_pairs *prest )
Line 1913  ND_pairs nd_minp( ND_pairs d, ND_pairs *prest )
 {  {
         ND_pairs m,ml,p,l;          ND_pairs m,ml,p,l;
         unsigned int *lcm;          unsigned int *lcm;
         int s,td,len,tlen,c;          int s,td,len,tlen,c,c1;
   
         if ( !(p = NEXT(m = d)) ) {          if ( !(p = NEXT(m = d)) ) {
                 *prest = p;                  *prest = p;
                 NEXT(m) = 0;                  NEXT(m) = 0;
                 return m;                  return m;
         }          }
         lcm = m->lcm;  
         s = SG(m);          s = SG(m);
         td = TD(m);          for ( ml = 0, l = m; p; p = NEXT(l = p) )
         len = nd_psl[m->i1]+nd_psl[m->i2];                  if ( (SG(p) < s) || ((SG(p) == s) && (NDP_COMPARE(p,m) < 0)) ) {
         for ( ml = 0, l = m; p; p = NEXT(l = p) ) {                          ml = l;
                 if (SG(p) < s)                          m = p;
                         goto find;                          s = SG(m);
                 else if ( SG(p) == s ) {  
                         if ( TD(p) < td )  
                                 goto find;  
                         else if ( TD(p) == td ) {  
                                 c = ndl_compare(p->lcm,lcm);  
                                 if ( c < 0 )  
                                         goto find;  
 #if 0  
                                 else if ( c == 0 ) {  
                                         tlen = nd_psl[p->i1]+nd_psl[p->i2];  
                                         if ( tlen < len )  
                                                 goto find;  
                                 }  
 #endif  
                         }  
                 }                  }
                 continue;  
 find:  
                 ml = l;  
                 m = p;  
                 lcm = m->lcm;  
                 s = SG(m);  
                 td = TD(m);  
                 len = tlen;  
         }  
         if ( !ml ) *prest = NEXT(m);          if ( !ml ) *prest = NEXT(m);
         else {          else {
                 NEXT(ml) = NEXT(m);                  NEXT(ml) = NEXT(m);
Line 1949  int nd_newps(int mod,ND a)
Line 1944  int nd_newps(int mod,ND a)
   
         if ( nd_psn == nd_pslen ) {          if ( nd_psn == nd_pslen ) {
                 nd_pslen *= 2;                  nd_pslen *= 2;
                 nd_psl = (int *)REALLOC((char *)nd_psl,nd_pslen*sizeof(int));  
                 nd_ps = (NDV *)REALLOC((char *)nd_ps,nd_pslen*sizeof(NDV));                  nd_ps = (NDV *)REALLOC((char *)nd_ps,nd_pslen*sizeof(NDV));
                 nd_psq = (NDV *)REALLOC((char *)nd_psq,nd_pslen*sizeof(NDV));                  nd_psq = (NDV *)REALLOC((char *)nd_psq,nd_pslen*sizeof(NDV));
                 nd_psh = (RHist *)REALLOC((char *)nd_psh,nd_pslen*sizeof(RHist));                  nd_psh = (RHist *)REALLOC((char *)nd_psh,nd_pslen*sizeof(RHist));
Line 1966  int nd_newps(int mod,ND a)
Line 1960  int nd_newps(int mod,ND a)
                 nd_ps[nd_psn] = b;                  nd_ps[nd_psn] = b;
         else          else
                 nd_psq[nd_psn] = b;                  nd_psq[nd_psn] = b;
         nd_psl[nd_psn] = len;  
         nd_free(a);          nd_free(a);
         return nd_psn++;          return nd_psn++;
 }  }
Line 1979  int nd_newps_trace(int mod,ND nf,ND nfq)
Line 1972  int nd_newps_trace(int mod,ND nf,ND nfq)
   
         if ( nd_psn == nd_pslen ) {          if ( nd_psn == nd_pslen ) {
                 nd_pslen *= 2;                  nd_pslen *= 2;
                 nd_psl = (int *)REALLOC((char *)nd_psl,nd_pslen*sizeof(int));  
                 nd_ps = (NDV *)REALLOC((char *)nd_ps,nd_pslen*sizeof(NDV));                  nd_ps = (NDV *)REALLOC((char *)nd_ps,nd_pslen*sizeof(NDV));
                 nd_psq = (NDV *)REALLOC((char *)nd_psq,nd_pslen*sizeof(NDV));                  nd_psq = (NDV *)REALLOC((char *)nd_psq,nd_pslen*sizeof(NDV));
                 nd_psh = (RHist *)REALLOC((char *)nd_psh,nd_pslen*sizeof(RHist));                  nd_psh = (RHist *)REALLOC((char *)nd_psh,nd_pslen*sizeof(RHist));
Line 1996  int nd_newps_trace(int mod,ND nf,ND nfq)
Line 1988  int nd_newps_trace(int mod,ND nf,ND nfq)
         nd_bound[nd_psn] = nd_compute_bound(nfq);          nd_bound[nd_psn] = nd_compute_bound(nfq);
         NEWRHist(r); SG(r) = SG(nf); TD(r) = HTD(nf); ndl_copy(HDL(nf),DL(r));          NEWRHist(r); SG(r) = SG(nf); TD(r) = HTD(nf); ndl_copy(HDL(nf),DL(r));
         nd_psh[nd_psn] = r;          nd_psh[nd_psn] = r;
   
         len = LEN(nd_psq[nd_psn]);  
         nd_psl[nd_psn] = len;  
   
         nd_free(nf); nd_free(nfq);          nd_free(nf); nd_free(nfq);
         return nd_psn++;          return nd_psn++;
 }  }
Line 2015  void nd_setup(int mod,NODE f)
Line 2003  void nd_setup(int mod,NODE f)
         nd_found = 0; nd_notfirst = 0; nd_create = 0;          nd_found = 0; nd_notfirst = 0; nd_create = 0;
   
         nd_psn = length(f); nd_pslen = 2*nd_psn;          nd_psn = length(f); nd_pslen = 2*nd_psn;
         nd_psl = (int *)MALLOC(nd_pslen*sizeof(int));  
         nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV));          nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV));
         nd_psq = (NDV *)MALLOC(nd_pslen*sizeof(NDV));          nd_psq = (NDV *)MALLOC(nd_pslen*sizeof(NDV));
         nd_psh = (RHist *)MALLOC(nd_pslen*sizeof(RHist));          nd_psh = (RHist *)MALLOC(nd_pslen*sizeof(RHist));
Line 2070  void nd_setup_trace(int mod,NODE f)
Line 2057  void nd_setup_trace(int mod,NODE f)
         nd_found = 0; nd_notfirst = 0; nd_create = 0;          nd_found = 0; nd_notfirst = 0; nd_create = 0;
   
         nd_psn = length(f); nd_pslen = 2*nd_psn;          nd_psn = length(f); nd_pslen = 2*nd_psn;
         nd_psl = (int *)MALLOC(nd_pslen*sizeof(int));  
         nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV));          nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV));
         nd_psq = (NDV *)MALLOC(nd_pslen*sizeof(NDV));          nd_psq = (NDV *)MALLOC(nd_pslen*sizeof(NDV));
         nd_psh = (RHist *)MALLOC(nd_pslen*sizeof(RHist));          nd_psh = (RHist *)MALLOC(nd_pslen*sizeof(RHist));
Line 2119  void nd_gr(LIST f,LIST v,int m,struct order_spec *ord,
Line 2105  void nd_gr(LIST f,LIST v,int m,struct order_spec *ord,
   
         get_vars((Obj)f,&fv); pltovl(v,&vv);          get_vars((Obj)f,&fv); pltovl(v,&vv);
         nd_nvar = length(vv);          nd_nvar = length(vv);
         if ( ord->id )          nd_init_ord(ord);
                 error("nd_gr : unsupported order");          /* XXX for DP */
         switch ( ord->ord.simple ) {  
                 case 0:  
                         is_rlex = 1;  
                         break;  
                 case 1:  
                         is_rlex = 0;  
                         break;  
                 default:  
                         error("nd_gr : unsupported order");  
         }  
         initd(ord);          initd(ord);
         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),&b);                  ptod(CO,vv,(P)BDY(t),&b);
Line 2166  void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o
Line 2142  void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o
   
         get_vars((Obj)f,&fv); pltovl(v,&vv);          get_vars((Obj)f,&fv); pltovl(v,&vv);
         nd_nvar = length(vv);          nd_nvar = length(vv);
         if ( ord->id )  
                 error("nd_gr : unsupported order");  
         initd(ord);          initd(ord);
         if ( homo ) {          if ( homo ) {
                 homogenize_order(ord,nd_nvar,&ord1);                  homogenize_order(ord,nd_nvar,&ord1);
                 switch ( ord1.ord.simple ) {  
                         case 0: is_rlex = 1; break;  
                         case 1: is_rlex = 0; break;  
                         default: error("nd_gr : unsupported order");  
                 }  
                 for ( fd0 = 0, in0 = 0, t = BDY(f); t; t = NEXT(t) ) {                  for ( fd0 = 0, in0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                         ptod(CO,vv,(P)BDY(t),&c);                          ptod(CO,vv,(P)BDY(t),&c);
                         if ( c ) {                          if ( c ) {
Line 2185  void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o
Line 2154  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);                  initd(&ord1);
                 nd_nvar++;                  nd_nvar++;
         } else {          } else {
                 switch ( ord->ord.simple ) {  
                         case 0: is_rlex = 1; break;  
                         case 1: is_rlex = 0; break;  
                         default: error("nd_gr : unsupported order");  
                 }  
                 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);
                         if ( c ) {                          if ( c ) {
Line 2201  void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o
Line 2166  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 {          do {
                 nd_setup_trace(m,fd0);                  nd_setup_trace(m,fd0);
Line 2241  void dltondl(int n,DL dl,unsigned int *r)
Line 2207  void dltondl(int n,DL dl,unsigned int *r)
   
         d = dl->d;          d = dl->d;
         bzero(r,nd_wpd*sizeof(unsigned int));          bzero(r,nd_wpd*sizeof(unsigned int));
         if ( is_rlex )          if ( nd_isrlex )
                 for ( i = 0; i < n; i++ )                  for ( i = 0; i < n; i++ )
                         r[(n-1-i)/nd_epw] |= (d[i]<<((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe));                          r[(n-1-i)/nd_epw] |= (d[i]<<((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe));
         else          else
Line 2258  DL ndltodl(int n,int td,unsigned int *ndl)
Line 2224  DL ndltodl(int n,int td,unsigned int *ndl)
         NEWDL(dl,n);          NEWDL(dl,n);
         TD(dl) = td;          TD(dl) = td;
         d = dl->d;          d = dl->d;
         if ( is_rlex )          if ( nd_isrlex )
                 for ( i = 0; i < n; i++ )                  for ( i = 0; i < n; i++ )
                         d[i] = (ndl[(n-1-i)/nd_epw]>>((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe))                          d[i] = (ndl[(n-1-i)/nd_epw]>>((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe))
                                 &((1<<nd_bpe)-1);                                  &((1<<nd_bpe)-1);
Line 2274  ND dptond(int mod,DP p)
Line 2240  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 2290  ND dptond(int mod,DP p)
Line 2256  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 2328  void ndl_print(unsigned int *dl)
Line 2293  void ndl_print(unsigned int *dl)
   
         n = nd_nvar;          n = nd_nvar;
         printf("<<");          printf("<<");
         if ( is_rlex )          if ( nd_isrlex )
                 for ( i = 0; i < n; i++ )                  for ( i = 0; i < n; i++ )
                         printf(i==n-1?"%d":"%d,",                          printf(i==n-1?"%d":"%d,",
                                 (dl[(n-1-i)/nd_epw]>>((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe))                                  (dl[(n-1-i)/nd_epw]>>((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe))
Line 2746  void nd_reconstruct_direct(int mod,NDV *ps,int len)
Line 2711  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 2761  void ndl_dup(int obpe,unsigned int *d,unsigned int *r)
Line 2737  void ndl_dup(int obpe,unsigned int *d,unsigned int *r)
         cbpe = nd_bpe;          cbpe = nd_bpe;
         for ( i = 0; i < nd_wpd; i++ )          for ( i = 0; i < nd_wpd; i++ )
                 r[i] = 0;                  r[i] = 0;
         if ( is_rlex )          if ( nd_isrlex )
                 for ( i = 0; i < n; i++ ) {                  for ( i = 0; i < n; i++ ) {
                         ei = (d[(n-1-i)/oepw]>>((oepw-((n-1-i)%oepw)-1)*obpe))                          ei = (d[(n-1-i)/oepw]>>((oepw-((n-1-i)%oepw)-1)*obpe))
                                 &((1<<obpe)-1);                                  &((1<<obpe)-1);
Line 2809  ND nd_copy(ND p)
Line 2785  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 2916  ND ndv_mul_nm(int mod,NDV p,NM m0)
Line 2892  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 2961  NDV ndtondv(int mod,ND p)
Line 2937  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 2994  ND ndvtond(int mod,NDV p)
Line 2970  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;
 }  }
Line 3125  NODE nd_reducebase(NODE x)
Line 3101  NODE nd_reducebase(NODE x)
         NEXT(t) = 0; x = t0;          NEXT(t) = 0; x = t0;
         return x;          return x;
 }  }
   
   void nd_init_ord(struct order_spec *ord)
   {
           if ( ord->id )
                   error("nd_gr : unsupported order");
           nd_degcompat = 0;
           switch ( ord->ord.simple ) {
                   case 0:
                           nd_degcompat = 1;
                           nd_isrlex = 1;
                           break;
                   case 1:
                           nd_degcompat = 1;
                           nd_isrlex = 0;
                           break;
                   default:
                           error("nd_gr : unsupported order");
           }
   }
   

Legend:
Removed from v.1.29  
changed lines
  Added in v.1.33

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