[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.31 and 1.32

version 1.31, 2003/08/13 03:13:22 version 1.32, 2003/08/19 04:38:09
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.30 2003/08/12 09:07:19 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.31 2003/08/13 03:13:22 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "inline.h"  #include "inline.h"
Line 67  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_generic)(NM a,NM b);
   int (*nmv_compare_generic)(NMV a,NMV 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 91  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 105  extern int Top,Reverse;
Line 109  extern int Top,Reverse;
 #define SG(a) ((a)->sugar)  #define SG(a) ((a)->sugar)
 #define LEN(a) ((a)->len)  #define LEN(a) ((a)->len)
   
   #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_generic)(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)))
Line 125  if(!(r)){(c)=(r)=(s);}else{NEXT(c)=(s);(c)=(s);}
Line 133  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 346  int ndl_dehomogenize(unsigned int *d)
Line 355  int ndl_dehomogenize(unsigned int *d)
         unsigned int h;          unsigned int h;
         int i,bits;          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 454  INLINE int ndl_compare(unsigned int *d1,unsigned int *
Line 463  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 824  ND nd_add(int mod,ND p1,ND p2)
Line 833  ND nd_add(int mod,ND p1,ND 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; ) {
                         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 888  ND nd_add_q(ND p1,ND p2)
Line 892  ND nd_add_q(ND p1,ND 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; ) {
                         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);
Line 1417  int head_pbucket(int mod,PGeoBucket g)
Line 1416  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 1471  int head_pbucket_q(PGeoBucket g)
Line 1465  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 1632  int ndv_compare(NDV *p1,NDV *p2)
Line 1621  int ndv_compare(NDV *p1,NDV *p2)
 {  {
         int td1,td2;          int td1,td2;
   
         td1 = HTD(*p1); td2 = HTD(*p2);          if ( nd_degcompat ) {
         if ( td1 > td2 ) return 1;                  td1 = HTD(*p1); td2 = HTD(*p2);
         else if ( td1 < td2 ) return -1;                  if ( td1 > td2 ) return 1;
         else return ndl_compare(HDL(*p1),HDL(*p2));                  else if ( td1 < td2 ) return -1;
                   else return ndl_compare(HDL(*p1),HDL(*p2));
           } else
                   return (*nmv_compare_generic)(BDY(*p1),BDY(*p2));
 }  }
   
 int ndv_compare_rev(NDV *p1,NDV *p2)  int ndv_compare_rev(NDV *p1,NDV *p2)
Line 2139  void nd_gr(LIST f,LIST v,int m,struct order_spec *ord,
Line 2131  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 2186  void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o
Line 2168  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 2205  void nd_gr_trace(LIST f,LIST v,int m,int homo,struct o
Line 2180  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 ) {                  switch ( ord->ord.simple ) {
                         case 0: is_rlex = 1; break;                          case 0: nd_isrlex = 1; nd_degcompat = 1; break;
                         case 1: is_rlex = 0; break;                          case 1: nd_isrlex = 0; nd_degcompat = 1; break;
                         default: error("nd_gr : unsupported order");                          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) ) {
Line 2261  void dltondl(int n,DL dl,unsigned int *r)
Line 2237  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 2278  DL ndltodl(int n,int td,unsigned int *ndl)
Line 2254  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 2347  void ndl_print(unsigned int *dl)
Line 2323  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 2791  void ndl_dup(int obpe,unsigned int *d,unsigned int *r)
Line 2767  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 3155  NODE nd_reducebase(NODE x)
Line 3131  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.31  
changed lines
  Added in v.1.32

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