[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.43 and 1.44

version 1.43, 2020/12/05 03:27:20 version 1.44, 2020/12/15 07:40:09
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.42 2020/12/03 07:58:54 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.43 2020/12/05 03:27:20 noro Exp $ */
   
 #include "nd.h"  #include "nd.h"
   
Line 67  static NODE nd_tracelist;
Line 67  static NODE nd_tracelist;
 static NODE nd_alltracelist;  static NODE nd_alltracelist;
 static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect,nd_lf,nd_norb;  static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect,nd_lf,nd_norb;
 static int nd_f4_td,nd_sba_f4step,nd_sba_pot,nd_sba_largelcm,nd_sba_dontsort,nd_sba_redundant_check;  static int nd_f4_td,nd_sba_f4step,nd_sba_pot,nd_sba_largelcm,nd_sba_dontsort,nd_sba_redundant_check;
 static int nd_top;  static int nd_top,nd_sba_syz;
 static int *nd_gbblock;  static int *nd_gbblock;
 static NODE nd_nzlist,nd_check_splist;  static NODE nd_nzlist,nd_check_splist;
 static int nd_splist;  static int nd_splist;
Line 104  int dp_getdeg(DP p);
Line 104  int dp_getdeg(DP p);
 int dpm_getdeg(DPM p,int *rank);  int dpm_getdeg(DPM p,int *rank);
 void dpm_ptozp(DPM p,Z *cont,DPM *r);  void dpm_ptozp(DPM p,Z *cont,DPM *r);
 int compdmm(int nv,DMM a,DMM b);  int compdmm(int nv,DMM a,DMM b);
   DPM sigtodpm(SIG s);
   SIG dup_sig(SIG sig);
   
 void Pdp_set_weight(NODE,VECT *);  void Pdp_set_weight(NODE,VECT *);
 void Pox_cmo_rpc(NODE,Obj *);  void Pox_cmo_rpc(NODE,Obj *);
Line 796  int _eqdl(int n,DL d1,DL d2);
Line 798  int _eqdl(int n,DL d1,DL d2);
   
 int ndl_module_schreyer_compare(UINT *m1,UINT *m2)  int ndl_module_schreyer_compare(UINT *m1,UINT *m2)
 {  {
   int pos1,pos2,t,j;    int pos1,pos2,t,j,retpot;
   DMM *in;    DMM *in;
   DMMstack s;    DMMstack s;
   static DL d1=0;    static DL d1=0;
   static DL d2=0;    static DL d2=0;
   static int dlen=0;    static int dlen=0;
     extern int ReversePOT;
   
     if ( ReversePOT ) retpot = -1;
     else retpot = 1;
   pos1 = MPOS(m1); pos2 = MPOS(m2);    pos1 = MPOS(m1); pos2 = MPOS(m2);
   if ( pos1 == pos2 ) return (*ndl_base_compare_function)(m1,m2);    if ( pos1 == pos2 ) return (*ndl_base_compare_function)(m1,m2);
   if ( nd_nvar > dlen ) {    if ( nd_nvar > dlen ) {
Line 819  int ndl_module_schreyer_compare(UINT *m1,UINT *m2)
Line 824  int ndl_module_schreyer_compare(UINT *m1,UINT *m2)
     _addtodl(nd_nvar,in[pos1]->dl,d1);      _addtodl(nd_nvar,in[pos1]->dl,d1);
     _addtodl(nd_nvar,in[pos2]->dl,d2);      _addtodl(nd_nvar,in[pos2]->dl,d2);
     if ( in[pos1]->pos == in[pos2]->pos && _eqdl(nd_nvar,d1,d2)) {      if ( in[pos1]->pos == in[pos2]->pos && _eqdl(nd_nvar,d1,d2)) {
       if ( pos1 < pos2 ) return 1;        if ( pos1 < pos2 ) return retpot;
       else if ( pos1 > pos2 ) return -1;        else if ( pos1 > pos2 ) return -retpot;
       else return 0;        else return 0;
     }      }
     pos1 = in[pos1]->pos;      pos1 = in[pos1]->pos;
Line 833  LAST:
Line 838  LAST:
     case 0:      case 0:
       t = (*dl_base_compare_function)(nd_nvar,d1,d2);        t = (*dl_base_compare_function)(nd_nvar,d1,d2);
       if ( t ) return t;        if ( t ) return t;
       else if ( pos1 < pos2 ) return 1;        else if ( pos1 < pos2 ) return retpot;
       else if ( pos1 > pos2 ) return -1;        else if ( pos1 > pos2 ) return -retpot;
       else return 0;        else return 0;
       break;        break;
     case 1:      case 1:
       if ( pos1 < pos2 ) return 1;        if ( pos1 < pos2 ) return retpot;
       else if ( pos1 > pos2 ) return -1;        else if ( pos1 > pos2 ) return -retpot;
       else return (*dl_base_compare_function)(nd_nvar,d1,d2);        else return (*dl_base_compare_function)(nd_nvar,d1,d2);
       break;        break;
     case 2:      case 2:
       if ( d1->td > d2->td  ) return 1;        if ( d1->td > d2->td  ) return 1;
       else 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 retpot;
       else if ( pos1 > pos2 ) return -1;        else if ( pos1 > pos2 ) return -retpot;
       else return (*dl_base_compare_function)(nd_nvar,d1,d2);        else return (*dl_base_compare_function)(nd_nvar,d1,d2);
       break;        break;
     default:      default:
Line 2631  int small_lcm(ND_pairs l)
Line 2636  int small_lcm(ND_pairs l)
   int i;    int i;
   NODE t;    NODE t;
   static DL lcm,mul,quo;    static DL lcm,mul,quo;
   static int nvar;    static int nvar = 0;
   
   if ( nd_sba_largelcm ) return 0;    if ( nd_sba_largelcm ) return 0;
   if ( nvar < nd_nvar ) {    if ( nvar < nd_nvar ) {
Line 2674  ND_pairs find_smallest_lcm(ND_pairs l)
Line 2679  ND_pairs find_smallest_lcm(ND_pairs l)
   ND_pairs r;    ND_pairs r;
   struct oSIG sig1;    struct oSIG sig1;
   static DL mul,quo,minlm;    static DL mul,quo,minlm;
   static int nvar;    static int nvar = 0;
   
   if ( nvar < nd_nvar ) {    if ( nvar < nd_nvar ) {
     nvar = nd_nvar;      nvar = nd_nvar;
Line 2749  struct oEGT eg_create,eg_newpairs,eg_merge;
Line 2754  struct oEGT eg_create,eg_newpairs,eg_merge;
   
 NODE conv_ilist_s(int demand,int trace,int **indp);  NODE conv_ilist_s(int demand,int trace,int **indp);
   
 NODE nd_sba_buch(int m,int ishomo,int **indp)  // S(fj*ei-fi*ej)
   
   SIG trivial_sig(int i,int j)
 {  {
     static struct oSIG sigi,sigj;
     static int nvar = 0;
     SIG sig;
   
     if ( nvar != nd_nvar ) {
       nvar = nd_nvar; NEWDL(sigi.dl,nvar); NEWDL(sigj.dl,nvar);
     }
     sigi.pos = i; _copydl(nd_nvar,nd_sba_hm[j],sigi.dl);
     sigj.pos = j; _copydl(nd_nvar,nd_sba_hm[i],sigj.dl);
     if ( comp_sig(&sigi,&sigj) > 0 ) sig = dup_sig(&sigi);
     else sig = dup_sig(&sigj);
     return sig;
   }
   
   NODE nd_sba_buch(int m,int ishomo,int **indp,NODE *syzp)
   {
   int i,j,nh,sugar,stat,pos;    int i,j,nh,sugar,stat,pos;
   NODE r,t,g;    NODE r,t,g;
   ND_pairs d;    ND_pairs d;
Line 2763  NODE nd_sba_buch(int m,int ishomo,int **indp)
Line 2786  NODE nd_sba_buch(int m,int ishomo,int **indp)
   LIST list;    LIST list;
   SIG sig;    SIG sig;
   NODE *syzlist;    NODE *syzlist;
     int ngen;
   int Nnominimal,Nredundant;    int Nnominimal,Nredundant;
   DL lcm,quo,mul;    DL lcm,quo,mul;
   struct oEGT eg1,eg2,eg_update,eg_remove,eg_large,eg_nf,eg_nfzero;    struct oEGT eg1,eg2,eg_update,eg_remove,eg_large,eg_nf,eg_nfzero;
Line 2775  init_eg(&eg_remove);
Line 2799  init_eg(&eg_remove);
   Nnominimal = 0;    Nnominimal = 0;
   Nredundant = 0;    Nredundant = 0;
   d = 0;    d = 0;
     ngen = nd_psn;
   for ( i = 0; i < nd_psn; i++ )    for ( i = 0; i < nd_psn; i++ )
     for ( j = i+1; j < nd_psn; j++ ) {      for ( j = i+1; j < nd_psn; j++ ) {
       NEWSIG(sig); sig->pos = j;        sig = trivial_sig(i,j);
       _copydl(nd_nvar,nd_sba_hm[i],sig->dl);  
       syzlist[sig->pos] = insert_sig(syzlist[sig->pos],sig);        syzlist[sig->pos] = insert_sig(syzlist[sig->pos],sig);
     }      }
   for ( i = 0; i < nd_psn; i++ ) {    for ( i = 0; i < nd_psn; i++ ) {
Line 2909  get_eg(&eg2); add_eg(&eg_remove,&eg1,&eg2);
Line 2933  get_eg(&eg2); add_eg(&eg_remove,&eg1,&eg2);
    print_eg("nfzero",&eg_nfzero);     print_eg("nfzero",&eg_nfzero);
    printf("\n");     printf("\n");
  }   }
    if ( nd_sba_syz ) {
      NODE hsyz,tsyz,prev;
   
      hsyz = 0;
      for ( i = 0; i < ngen; i++ ) {
        tsyz = syzlist[i];
        for ( prev = 0; tsyz != 0; prev = tsyz, tsyz = NEXT(tsyz))
          BDY(tsyz) = (pointer)sigtodpm((SIG)BDY(tsyz));
        if ( prev != 0 ) {
          prev->next = hsyz; hsyz = syzlist[i];
        }
      }
      *syzp = hsyz;
    } else *syzp = 0;
  return g;   return g;
 }  }
   
Line 3400  int comp_sig(SIG s1,SIG s2)
Line 3438  int comp_sig(SIG s1,SIG s2)
     else return (*cmpdl)(nd_nvar,s1->dl,s2->dl);      else return (*cmpdl)(nd_nvar,s1->dl,s2->dl);
   } else {    } else {
     static DL m1,m2;      static DL m1,m2;
     static int nvar;      static int nvar = 0;
     int ret;      int ret;
   
     if ( nvar != nd_nvar ) {      if ( nvar != nd_nvar ) {
Line 3571  ND_pairs nd_newpairs_s(int t, NODE *syz)
Line 3609  ND_pairs nd_newpairs_s(int t, NODE *syz)
   int ts,ret,i;    int ts,ret,i;
   ND_pairs r,r0,_sp,sp;    ND_pairs r,r0,_sp,sp;
   SIG spsig,tsig;    SIG spsig,tsig;
   static int nvar;    static int nvar = 0;
   static SIG _sig1,_sig2;    static SIG _sig1,_sig2;
   struct oEGT eg1,eg2,eg3,eg4;    struct oEGT eg1,eg2,eg3,eg4;
   
Line 4454  NODE nd_sba_f4(int m,int **indp);
Line 4492  NODE nd_sba_f4(int m,int **indp);
 void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int f4,struct order_spec *ord,LIST *rp)  void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int f4,struct order_spec *ord,LIST *rp)
 {  {
   VL tv,fv,vv,vc,av;    VL tv,fv,vv,vc,av;
   NODE fd,fd0,r,r0,t,x,s,xx;    NODE fd,fd0,r,r0,t,x,s,xx,nd,syz;
   int e,max,nvar,i;    int e,max,nvar,i;
   NDV b;    NDV b;
   int ishomo,nalg,wmax,len;    int ishomo,nalg,wmax,len;
Line 4539  void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int
Line 4577  void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int
   }    }
   
   ndv_setup(m,0,fd0,nd_sba_dontsort,0,1);    ndv_setup(m,0,fd0,nd_sba_dontsort,0,1);
   x = f4 ? nd_sba_f4(m,&perm) : nd_sba_buch(m,ishomo || homo,&perm);    x = f4 ? nd_sba_f4(m,&perm) : nd_sba_buch(m,ishomo || homo,&perm,&syz);
   if ( !x ) {    if ( !x ) {
     *rp = 0; return;      *rp = 0; return;
   }    }
Line 4562  void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int
Line 4600  void nd_sba(LIST f,LIST v,int m,int homo,int retdp,int
     else BDY(r) = ndvtop(m,CO,vv,BDY(t));      else BDY(r) = ndvtop(m,CO,vv,BDY(t));
   }    }
   if ( r0 ) NEXT(r) = 0;    if ( r0 ) NEXT(r) = 0;
   MKLIST(*rp,r0);    if ( nd_sba_syz ) {
       LIST gb,hsyz;
       NODE nd;
   
       MKLIST(gb,r0);
       MKLIST(hsyz,syz);
       nd = mknode(2,gb,hsyz);
       MKLIST(*rp,nd);
     } else
       MKLIST(*rp,r0);
   get_eg(&eg1); init_eg(&egconv); add_eg(&egconv,&eg0,&eg1);    get_eg(&eg1); init_eg(&egconv); add_eg(&egconv,&eg0,&eg1);
   print_eg("conv",&egconv); fprintf(asir_out,"\n");    print_eg("conv",&egconv); fprintf(asir_out,"\n");
 }  }
Line 6902  DP ndvtodp(int mod,NDV p)
Line 6949  DP ndvtodp(int mod,NDV p)
     return d;      return d;
 }  }
   
   DPM sigtodpm(SIG s)
   {
     DMM m;
     DPM d;
   
     NEWDMM(m);
     m->c = (Obj)ONE;
     m->dl = s->dl;
     m->pos = s->pos+1;
     m->next = 0;
     MKDPM(nd_nvar,m,d);
     SG(d) = s->dl->td;
     return d;
   }
   
 DPM ndvtodpm(int mod,NDV p)  DPM ndvtodpm(int mod,NDV p)
 {  {
   DMM m,m0;    DMM m,m0;
Line 9987  void parse_nd_option(NODE opt)
Line 10049  void parse_nd_option(NODE opt)
   nd_sugarweight = 0; nd_f4red =0; nd_rank0 = 0;    nd_sugarweight = 0; nd_f4red =0; nd_rank0 = 0;
   nd_f4_td = 0; nd_sba_f4step = 2; nd_sba_pot = 0; nd_sba_largelcm = 0;    nd_f4_td = 0; nd_sba_f4step = 2; nd_sba_pot = 0; nd_sba_largelcm = 0;
   nd_sba_dontsort = 0; nd_top = 0; nd_sba_redundant_check = 0;    nd_sba_dontsort = 0; nd_top = 0; nd_sba_redundant_check = 0;
     nd_sba_syz = 0;
   
   for ( t = opt; t; t = NEXT(t) ) {    for ( t = opt; t; t = NEXT(t) ) {
     p = BDY((LIST)BDY(t));      p = BDY((LIST)BDY(t));
Line 10045  void parse_nd_option(NODE opt)
Line 10108  void parse_nd_option(NODE opt)
     } else if ( !strcmp(key,"sba_f4step") ) {      } else if ( !strcmp(key,"sba_f4step") ) {
       nd_sba_f4step = value?ZTOS((Q)value):0;        nd_sba_f4step = value?ZTOS((Q)value):0;
     } else if ( !strcmp(key,"sba_pot") ) {      } else if ( !strcmp(key,"sba_pot") ) {
       nd_sba_pot = value?1:0;        nd_sba_pot = ZTOS((Q)value);
     } else if ( !strcmp(key,"sba_largelcm") ) {      } else if ( !strcmp(key,"sba_largelcm") ) {
       nd_sba_largelcm = value?1:0;        nd_sba_largelcm = value?1:0;
     } else if ( !strcmp(key,"sba_dontsort") ) {      } else if ( !strcmp(key,"sba_dontsort") ) {
       nd_sba_dontsort = value?1:0;        nd_sba_dontsort = value?1:0;
       } else if ( !strcmp(key,"sba_syz") ) {
         nd_sba_syz = value?1:0;
     } else if ( !strcmp(key,"sba_redundant_check") ) {      } else if ( !strcmp(key,"sba_redundant_check") ) {
       nd_sba_redundant_check = value?1:0;        nd_sba_redundant_check = value?1:0;
     } else if ( !strcmp(key,"top") ) {      } else if ( !strcmp(key,"top") ) {
       nd_top = value?1:0;        nd_top = value?1:0;
     }      }
   }    }
     if ( nd_sba_syz ) nd_sba_dontsort = 1;
 }  }
   
 ND mdptond(DP d);  ND mdptond(DP d);

Legend:
Removed from v.1.43  
changed lines
  Added in v.1.44

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