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

Diff for /OpenXM_contrib2/asir2018/engine/nd.c between version 1.20 and 1.21

version 1.20, 2019/09/15 08:46:12 version 1.21, 2019/09/19 06:29:48
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.19 2019/09/04 05:32:10 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.20 2019/09/15 08:46:12 noro Exp $ */
   
 #include "nd.h"  #include "nd.h"
   
Line 8  struct oEGT eg_search,f4_symb,f4_conv,f4_elim1,f4_elim
Line 8  struct oEGT eg_search,f4_symb,f4_conv,f4_elim1,f4_elim
 int diag_period = 6;  int diag_period = 6;
 int weight_check = 1;  int weight_check = 1;
 int (*ndl_compare_function)(UINT *a1,UINT *a2);  int (*ndl_compare_function)(UINT *a1,UINT *a2);
 /* for schreyer order */  /* for general module order */
 int (*ndl_base_compare_function)(UINT *a1,UINT *a2);  int (*ndl_base_compare_function)(UINT *a1,UINT *a2);
   int (*dl_base_compare_function)(int nv,DL a,DL b);
   int nd_base_ordtype;
 int nd_dcomp;  int nd_dcomp;
 int nd_rref2;  int nd_rref2;
 NM _nm_free_list;  NM _nm_free_list;
Line 57  static int nd_worb_len;
Line 59  static int nd_worb_len;
 static int nd_found,nd_create,nd_notfirst;  static int nd_found,nd_create,nd_notfirst;
 static int nmv_adv;  static int nmv_adv;
 static int nd_demand;  static int nd_demand;
 static int nd_module,nd_ispot,nd_mpos,nd_pot_nelim;  static int nd_module,nd_module_ordtype,nd_mpos,nd_pot_nelim;
 static int nd_module_rank,nd_poly_weight_len;  static int nd_module_rank,nd_poly_weight_len;
 static int *nd_poly_weight,*nd_module_weight;  static int *nd_poly_weight,*nd_module_weight;
 static NODE nd_tracelist;  static NODE nd_tracelist;
Line 526  void ndl_weight_mask(UINT *d)
Line 528  void ndl_weight_mask(UINT *d)
     }      }
 }  }
   
   int ndl_glex_compare(UINT *d1,UINT *d2)
   {
     if ( TD(d1) > TD(d2) ) return 1;
     else if ( TD(d1) < TD(d2) ) return -1;
     else return ndl_lex_compare(d1,d2);
   }
   
 int ndl_lex_compare(UINT *d1,UINT *d2)  int ndl_lex_compare(UINT *d1,UINT *d2)
 {  {
     int i;      int i;
Line 695  int ndl_ww_lex_compare(UINT *d1,UINT *d2)
Line 704  int ndl_ww_lex_compare(UINT *d1,UINT *d2)
     return ndl_lex_compare(d1,d2);      return ndl_lex_compare(d1,d2);
 }  }
   
 int ndl_module_weight_compare(UINT *d1,UINT *d2)  // common function for module glex and grlex comparison
   int ndl_module_glex_compare(UINT *d1,UINT *d2)
 {  {
   int s,j;    int c;
   
   if ( nd_nvar != nd_poly_weight_len )    switch ( nd_module_ordtype ) {
     error("invalid module weight : the length of polynomial weight != the number of variables");      case 0:
   s = 0;        if ( TD(d1) > TD(d2) ) return 1;
   for ( j = 0; j < nd_nvar; j++ )        else if ( TD(d1) < TD(d2) ) return -1;
      s += (GET_EXP(d1,j)-GET_EXP(d2,j))*nd_poly_weight[j];        else if ( (c = ndl_lex_compare(d1,d2)) != 0 ) return c;
   if ( MPOS(d1) >= 1 && MPOS(d2) >= 1 ) {        else if ( MPOS(d1) < MPOS(d2) ) return 1;
     s += nd_module_weight[MPOS(d1)-1]-nd_module_weight[MPOS(d2)-1];        else if ( MPOS(d1) > MPOS(d2) ) return -1;
   }        else return 0;
   if ( s > 0 ) return 1;        break;
   else if ( s < 0 ) return -1;  
   else return 0;  
 }  
   
 int ndl_module_grlex_compare(UINT *d1,UINT *d2)      case 1:
 {  
     int i,c;  
   
 //    if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return c;  
     if ( nd_ispot ) {  
       if ( nd_pot_nelim && MPOS(d1)>=nd_pot_nelim+1 && MPOS(d2) >= nd_pot_nelim+1 ) {        if ( nd_pot_nelim && MPOS(d1)>=nd_pot_nelim+1 && MPOS(d2) >= nd_pot_nelim+1 ) {
          if ( TD(d1) > TD(d2) ) return 1;           if ( TD(d1) > TD(d2) ) return 1;
          else if ( TD(d1) < TD(d2) ) return -1;           else if ( TD(d1) < TD(d2) ) return -1;
          if ( (c = ndl_lex_compare(d1,d2)) != 0 ) return c;           if ( (c = ndl_lex_compare(d1,d2)) != 0 ) return c;
          if ( MPOS(d1) < MPOS(d2) ) return 1;           if ( MPOS(d1) < MPOS(d2) ) return 1;
          else if ( MPOS(d1) > MPOS(d2) ) return -1;           else if ( MPOS(d1) > MPOS(d2) ) return -1;
          return 0;  
       }        }
       if ( MPOS(d1) < MPOS(d2) ) return 1;        if ( MPOS(d1) < MPOS(d2) ) return 1;
       else if ( MPOS(d1) > MPOS(d2) ) return -1;        else if ( MPOS(d1) > MPOS(d2) ) return -1;
     }        else if ( TD(d1) > TD(d2) ) return 1;
     if ( TD(d1) > TD(d2) ) return 1;        else if ( TD(d1) < TD(d2) ) return -1;
     else if ( TD(d1) < TD(d2) ) return -1;        else return ndl_lex_compare(d1,d2);
     if ( (c = ndl_lex_compare(d1,d2)) != 0 ) return c;        break;
     if ( !nd_ispot ) {  
         if ( MPOS(d1) < MPOS(d2) ) return 1;  
         else if ( MPOS(d1) > MPOS(d2) ) return -1;  
     }  
     return 0;  
 }  
   
 int ndl_module_glex_compare(UINT *d1,UINT *d2)      case 2: // weight -> POT
 {        if ( TD(d1) > TD(d2) ) return 1;
     int i,c;        else if ( TD(d1) < TD(d2) ) return -1;
         else if ( MPOS(d1) < MPOS(d2) ) return 1;
         else if ( MPOS(d1) > MPOS(d2) ) return -1;
         else return ndl_lex_compare(d1,d2);
         break;
   
 //    if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return c;      default:
     if ( nd_ispot ) {        error("ndl_module_glex_compare : invalid module_ordtype");
         if ( MPOS(d1) < MPOS(d2) ) return 1;    }
         else if ( MPOS(d1) > MPOS(d2) ) return -1;  
     }  
     if ( TD(d1) > TD(d2) ) return 1;  
     else if ( TD(d1) < TD(d2) ) return -1;  
     if ( (c = ndl_lex_compare(d1,d2)) != 0 ) return c;  
     if ( !nd_ispot ) {  
         if ( MPOS(d1) < MPOS(d2) ) return 1;  
         else if ( MPOS(d1) > MPOS(d2) ) return -1;  
     }  
     return 0;  
 }  }
   
 int ndl_module_lex_compare(UINT *d1,UINT *d2)  // common  for module comparison
   int ndl_module_compare(UINT *d1,UINT *d2)
 {  {
     int i,c;    int c;
   
 //    if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return c;    switch ( nd_module_ordtype ) {
     if ( nd_ispot ) {      case 0:
         if ( MPOS(d1) < MPOS(d2) ) return 1;        if ( (c = ndl_lex_compare(d1,d2)) != 0 ) return c;
         else if ( MPOS(d1) > MPOS(d2) ) return -1;        else if ( MPOS(d1) > MPOS(d2) ) return -1;
     }        else if ( MPOS(d1) < MPOS(d2) ) return 1;
     if ( (c = ndl_lex_compare(d1,d2)) != 0 ) return c;        else return 0;
     if ( !nd_ispot ) {        break;
         if ( MPOS(d1) < MPOS(d2) ) return 1;  
         else if ( MPOS(d1) > MPOS(d2) ) return -1;  
     }  
     return 0;  
 }  
   
 int ndl_module_block_compare(UINT *d1,UINT *d2)      case 1:
 {        if ( MPOS(d1) < MPOS(d2) ) return 1;
     int i,c;        else if ( MPOS(d1) > MPOS(d2) ) return -1;
         else return (*ndl_base_compare_function)(d1,d2);
         break;
   
 //    if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return c;      case 2: // weight -> POT
     if ( nd_ispot ) {        if ( TD(d1) > TD(d2) ) return 1;
         if ( MPOS(d1) < MPOS(d2) ) return 1;        else if ( TD(d1) < TD(d2) ) return -1;
         else if ( MPOS(d1) > MPOS(d2) ) return -1;        else if ( MPOS(d1) < MPOS(d2) ) return 1;
     }        else if ( MPOS(d1) > MPOS(d2) ) return -1;
     if ( (c = ndl_block_compare(d1,d2)) != 0 ) return c;        else return (*ndl_base_compare_function)(d1,d2);
     if ( !nd_ispot ) {        break;
         if ( MPOS(d1) < MPOS(d2) ) return 1;  
         else if ( MPOS(d1) > MPOS(d2) ) return -1;  
     }  
     return 0;  
 }  
   
 int ndl_module_matrix_compare(UINT *d1,UINT *d2)      default:
 {        error("ndl_module_compare : invalid module_ordtype");
     int i,c;    }
   
 //    if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return c;  
     if ( nd_ispot ) {  
         if ( MPOS(d1) < MPOS(d2) ) return 1;  
         else if ( MPOS(d1) > MPOS(d2) ) return -1;  
     }  
     if ( (c = ndl_matrix_compare(d1,d2)) != 0 ) return c;  
     if ( !nd_ispot ) {  
         if ( MPOS(d1) < MPOS(d2) ) return 1;  
         else if ( MPOS(d1) > MPOS(d2) ) return -1;  
     }  
     return 0;  
 }  }
   
 int ndl_module_composite_compare(UINT *d1,UINT *d2)  extern DMMstack dmm_stack;
   void _addtodl(int n,DL d1,DL d2);
   int _eqdl(int n,DL d1,DL d2);
   
   int ndl_module_schreyer_compare(UINT *m1,UINT *m2)
 {  {
     int i,c;    int pos1,pos2,t,j;
     DMM *in;
     DMMstack s;
     static DL d1=0;
     static DL d2=0;
     static int dlen=0;
   
 //    if ( nd_module_rank && (c = ndl_module_weight_compare(d1,d2)) ) return c;    pos1 = MPOS(m1); pos2 = MPOS(m2);
     if ( nd_ispot ) {    if ( pos1 == pos2 ) return (*ndl_base_compare_function)(m1,m2);
         if ( MPOS(d1) > MPOS(d2) ) return 1;    if ( nd_nvar > dlen ) {
         else if ( MPOS(d1) < MPOS(d2) ) return -1;      NEWDL(d1,nd_nvar);
       NEWDL(d2,nd_nvar);
       dlen = nd_nvar;
     }
     d1->td = TD(m1);
     for ( j = 0; j < nd_nvar; j++ ) d1->d[j] = GET_EXP(m1,j);
     d2->td = TD(m2);
     for ( j = 0; j < nd_nvar; j++ ) d2->d[j] = GET_EXP(m2,j);
     for ( s = dmm_stack; s; s = NEXT(s) ) {
       in = s->in;
       _addtodl(nd_nvar,in[pos1]->dl,d1);
       _addtodl(nd_nvar,in[pos2]->dl,d2);
       if ( in[pos1]->pos == in[pos2]->pos && _eqdl(nd_nvar,d1,d2)) {
         if ( pos1 < pos2 ) return 1;
         else if ( pos1 > pos2 ) return -1;
         else return 0;
     }      }
     if ( (c = ndl_composite_compare(d1,d2)) != 0 ) return c;      pos1 = in[pos1]->pos;
     if ( !nd_ispot ) {      pos2 = in[pos2]->pos;
         if ( MPOS(d1) > MPOS(d2) ) return 1;      if ( pos1 == pos2 ) return (*dl_base_compare_function)(nd_nvar,d1,d2);
         else if ( MPOS(d1) < MPOS(d2) ) return -1;    }
     }    // comparison by the bottom order
     return 0;  LAST:
     switch ( nd_base_ordtype ) {
       case 0:
         t = (*dl_base_compare_function)(nd_nvar,d1,d2);
         if ( t ) return t;
         else if ( pos1 < pos2 ) return 1;
         else if ( pos1 > pos2 ) return -1;
         else return 0;
         break;
       case 1:
         if ( pos1 < pos2 ) return 1;
         else if ( pos1 > pos2 ) return -1;
         else return (*dl_base_compare_function)(nd_nvar,d1,d2);
         break;
       case 2:
         if ( d1->td > d2->td  ) return 1;
         else if ( d1->td < d2->td ) return -1;
         else if ( pos1 < pos2 ) return 1;
         else if ( pos1 > pos2 ) return -1;
         else return (*dl_base_compare_function)(nd_nvar,d1,d2);
         break;
       default:
         error("ndl_schreyer_compare : invalid base ordtype");
     }
 }  }
   
 INLINE int ndl_equal(UINT *d1,UINT *d2)  INLINE int ndl_equal(UINT *d1,UINT *d2)
Line 4487  UINT *nd_compute_bound(ND p)
Line 4504  UINT *nd_compute_bound(ND p)
 int nd_get_exporigin(struct order_spec *ord)  int nd_get_exporigin(struct order_spec *ord)
 {  {
     switch ( ord->id ) {      switch ( ord->id ) {
         case 0: case 2: case 256: case 258:          case 0: case 2: case 256: case 258: case 300:
             return 1+nd_module;              return 1+nd_module;
         case 1: case 257:          case 1: case 257:
             /* block order */              /* block order */
Line 5543  NODE dpm_sort_list(NODE l)
Line 5560  NODE dpm_sort_list(NODE l)
   
 int nmv_comp(NMV a,NMV b)  int nmv_comp(NMV a,NMV b)
 {  {
   return -DL_COMPARE(a->dl,b->dl);    int t;
     t = DL_COMPARE(a->dl,b->dl);
     return -t;
 }  }
   
 NDV dpmtondv(int mod,DPM p)  NDV dpmtondv(int mod,DPM p)
Line 5731  NODE ndv_reducebase(NODE x,int *perm)
Line 5750  NODE ndv_reducebase(NODE x,int *perm)
   
 /* XXX incomplete */  /* XXX incomplete */
   
 extern int dpm_ordtype;  extern DMMstack dmm_stack;
   int ndl_module_schreyer_compare(UINT *a,UINT *b);
   
 void nd_init_ord(struct order_spec *ord)  void nd_init_ord(struct order_spec *ord)
 {  {
   nd_module = (ord->id >= 256);    nd_module = (ord->id >= 256);
   if ( nd_module ) {    if ( nd_module ) {
     nd_dcomp = -1;      nd_dcomp = -1;
     nd_ispot = ord->ispot;      nd_module_ordtype = ord->module_ordtype;
     nd_pot_nelim = ord->pot_nelim;      nd_pot_nelim = ord->pot_nelim;
     nd_poly_weight_len = ord->nv;      nd_poly_weight_len = ord->nv;
     nd_poly_weight = ord->top_weight;      nd_poly_weight = ord->top_weight;
     nd_module_rank = ord->module_rank;      nd_module_rank = ord->module_rank;
     nd_module_weight = ord->module_top_weight;      nd_module_weight = ord->module_top_weight;
     dpm_ordtype = ord->ispot;  
   }    }
   nd_matrix = 0;    nd_matrix = 0;
   nd_matrix_len = 0;    nd_matrix_len = 0;
Line 5803  void nd_init_ord(struct order_spec *ord)
Line 5822  void nd_init_ord(struct order_spec *ord)
         case 256:          case 256:
             switch ( ord->ord.simple ) {              switch ( ord->ord.simple ) {
                 case 0:                  case 0:
                       nd_dcomp = 0;
                     nd_isrlex = 1;                      nd_isrlex = 1;
                     ndl_compare_function = ndl_module_grlex_compare;                      ndl_compare_function = ndl_module_glex_compare;
                     break;                      break;
                 case 1:                  case 1:
                       nd_dcomp = 0;
                     nd_isrlex = 0;                      nd_isrlex = 0;
                     ndl_compare_function = ndl_module_glex_compare;                      ndl_compare_function = ndl_module_glex_compare;
                     break;                      break;
                 case 2:                  case 2:
                       nd_dcomp = 0;
                     nd_isrlex = 0;                      nd_isrlex = 0;
                     ndl_compare_function = ndl_module_lex_compare;                      ndl_compare_function = ndl_module_compare;
                       ndl_base_compare_function = ndl_lex_compare;
                     break;                      break;
                 default:                  default:
                     error("nd_gr : unsupported order");                      error("nd_init_ord : unsupported order");
             }              }
             break;              break;
         case 257:          case 257:
             /* block order */              /* block order */
             nd_isrlex = 0;              nd_isrlex = 0;
             ndl_compare_function = ndl_module_block_compare;              ndl_compare_function = ndl_module_compare;
               ndl_base_compare_function = ndl_block_compare;
             break;              break;
         case 258:          case 258:
             /* matrix order */              /* matrix order */
             nd_isrlex = 0;              nd_isrlex = 0;
             nd_matrix_len = ord->ord.matrix.row;              nd_matrix_len = ord->ord.matrix.row;
             nd_matrix = ord->ord.matrix.matrix;              nd_matrix = ord->ord.matrix.matrix;
             ndl_compare_function = ndl_module_matrix_compare;              ndl_compare_function = ndl_module_compare;
               ndl_base_compare_function = ndl_matrix_compare;
             break;              break;
         case 259:          case 259:
             /* composite order */              /* composite order */
             nd_isrlex = 0;              nd_isrlex = 0;
             nd_worb_len = ord->ord.composite.length;              nd_worb_len = ord->ord.composite.length;
             nd_worb = ord->ord.composite.w_or_b;              nd_worb = ord->ord.composite.w_or_b;
             ndl_compare_function = ndl_module_composite_compare;              ndl_compare_function = ndl_module_compare;
               ndl_base_compare_function = ndl_composite_compare;
             break;              break;
           case 300:
               /* schreyer order */
               if ( ord->base->id != 256 )
                  error("nd_init_ord : unsupported base order");
               ndl_compare_function = ndl_module_schreyer_compare;
               dmm_stack = ord->dmmstack;
               switch ( ord->base->ord.simple ) {
                   case 0:
                       nd_isrlex = 1;
                       ndl_base_compare_function = ndl_glex_compare;
                       dl_base_compare_function = cmpdl_revgradlex;
                       break;
                   case 1:
                       nd_isrlex = 0;
                       ndl_base_compare_function = ndl_glex_compare;
                       dl_base_compare_function = cmpdl_gradlex;
                       break;
                   case 2:
                       nd_isrlex = 0;
                       ndl_base_compare_function = ndl_lex_compare;
                       dl_base_compare_function = cmpdl_lex;
                       break;
                   default:
                       error("nd_init_ord : unsupported order");
               }
               break;
     }      }
     nd_ord = ord;      nd_ord = ord;
 }  }
Line 5872  EPOS nd_create_epos(struct order_spec *ord)
Line 5924  EPOS nd_create_epos(struct order_spec *ord)
   
     epos = (EPOS)MALLOC_ATOMIC(nd_nvar*sizeof(struct oEPOS));      epos = (EPOS)MALLOC_ATOMIC(nd_nvar*sizeof(struct oEPOS));
     switch ( ord->id ) {      switch ( ord->id ) {
         case 0: case 256:          case 0: case 256: case 300:
             if ( nd_isrlex ) {              if ( nd_isrlex ) {
                 for ( i = 0; i < nd_nvar; i++ ) {                  for ( i = 0; i < nd_nvar; i++ ) {
                     epos[i].i = nd_exporigin + (nd_nvar-1-i)/nd_epw;                      epos[i].i = nd_exporigin + (nd_nvar-1-i)/nd_epw;

Legend:
Removed from v.1.20  
changed lines
  Added in v.1.21

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