[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.188 and 1.196

version 1.188, 2010/04/26 01:10:04 version 1.196, 2011/06/16 08:17:15
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.187 2010/04/26 01:06:22 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.195 2011/02/18 02:54:48 noro Exp $ */
   
 #include "nd.h"  #include "nd.h"
   
Line 49  static int nd_demand;
Line 49  static int nd_demand;
 static int nd_module,nd_ispot,nd_mpos,nd_pot_nelim;  static int nd_module,nd_ispot,nd_mpos,nd_pot_nelim;
 static NODE nd_tracelist;  static NODE nd_tracelist;
 static NODE nd_alltracelist;  static NODE nd_alltracelist;
 static int nd_gentrace,nd_gensyz,nd_nora;  static int nd_gentrace,nd_gensyz,nd_nora,nd_newelim,nd_intersect;
 static int *nd_gbblock;  static int *nd_gbblock;
   
 NumberField get_numberfield();  NumberField get_numberfield();
Line 1343  int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND
Line 1343  int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND
                 node = mknode(4,div,iq,dmul,ONE);                  node = mknode(4,div,iq,dmul,ONE);
             }              }
             sugar = MAX(sugar,SG(p)+TD(DL(mul)));              sugar = MAX(sugar,SG(p)+TD(DL(mul)));
             if ( !mod && g && ((double)(p_mag(HCP(g))) > hmag) ) {              if ( !mod && g && !nd_vc && ((double)(p_mag(HCP(g))) > hmag) ) {
                 hg = HCU(g);                  hg = HCU(g);
                 nd_removecont2(d,g);                  nd_removecont2(d,g);
                 if ( dn || nd_gentrace ) {                  if ( dn || nd_gentrace ) {
Line 1918  again:
Line 1918  again:
             goto again;              goto again;
         } else if ( nf ) {          } else if ( nf ) {
             if ( checkonly || gensyz ) return 0;              if ( checkonly || gensyz ) return 0;
                           if ( nd_newelim ) {
                                   if ( nd_module ) {
                                           if ( MPOS(HDL(nf)) > 1 ) return 0;
                                   } else if ( !(HDL(nf)[nd_exporigin] & nd_mask[0]) ) return 0;
                           }
             if ( DP_Print ) { printf("+"); fflush(stdout); }              if ( DP_Print ) { printf("+"); fflush(stdout); }
             hc = HCU(nf);              hc = HCU(nf);
             nd_removecont(m,nf);              nd_removecont(m,nf);
Line 1928  again:
Line 1933  again:
             if ( nd_gentrace ) {              if ( nd_gentrace ) {
                                 cont = ndc_div(m,hc,HCU(nf));                                  cont = ndc_div(m,hc,HCU(nf));
                                 if ( m || !UNIQ(cont) ) {                                  if ( m || !UNIQ(cont) ) {
                     t = mknode(4,0,0,0,cont);                      t = mknode(4,NULLP,NULLP,NULLP,cont);
                     MKLIST(list,t); MKNODE(t,list,nd_tracelist);                      MKLIST(list,t); MKNODE(t,list,nd_tracelist);
                                         nd_tracelist = t;                                          nd_tracelist = t;
                                 }                                  }
Line 2130  again:
Line 2135  again:
                 if ( nd_gentrace ) {                  if ( nd_gentrace ) {
                                    cont = ndc_div(0,hnfq,HCU(nfqv));                                     cont = ndc_div(0,hnfq,HCU(nfqv));
                                    if ( !UNIQ(cont) ) {                                     if ( !UNIQ(cont) ) {
                        t = mknode(4,0,0,0,cont);                         t = mknode(4,NULLP,NULLP,NULLP,cont);
                        MKLIST(list,t); MKNODE(t,list,nd_tracelist);                         MKLIST(list,t); MKNODE(t,list,nd_tracelist);
                                            nd_tracelist = t;                                             nd_tracelist = t;
                                    }                                     }
Line 2306  ND_pairs nd_newpairs( NODE g, int t )
Line 2311  ND_pairs nd_newpairs( NODE g, int t )
   
     dl = DL(nd_psh[t]);      dl = DL(nd_psh[t]);
     ts = SG(nd_psh[t]) - TD(dl);      ts = SG(nd_psh[t]) - TD(dl);
           if ( nd_module && nd_intersect && (MPOS(dl) > 1) ) return 0;
     for ( r0 = 0, h = g; h; h = NEXT(h) ) {      for ( r0 = 0, h = g; h; h = NEXT(h) ) {
         if ( nd_module && (MPOS(DL(nd_psh[(long)BDY(h)])) != MPOS(dl)) )          if ( nd_module && (MPOS(DL(nd_psh[(long)BDY(h)])) != MPOS(dl)) )
                 continue;                  continue;
Line 2818  void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct 
Line 2824  void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct 
         Q jq;          Q jq;
     int *perm;      int *perm;
     EPOS oepos;      EPOS oepos;
     int obpe,oadv,ompos;      int obpe,oadv,ompos,cbpe;
   
     nd_module = 0;      nd_module = 0;
     if ( !m && Demand ) nd_demand = 1;      if ( !m && Demand ) nd_demand = 1;
Line 2910  void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct 
Line 2916  void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct 
         MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0);          MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0);
     }      }
     x = f4?nd_f4(m,&perm):nd_gb(m,ishomo || homo,0,0,&perm);      x = f4?nd_f4(m,&perm):nd_gb(m,ishomo || homo,0,0,&perm);
           if ( !x ) {
                   *rp = 0; return;
           }
         if ( !ishomo && homo ) {          if ( !ishomo && homo ) {
                 /* dehomogenization */                  /* dehomogenization */
                 for ( t = x; t; t = NEXT(t) ) ndv_dehomogenize((NDV)BDY(t),ord);                  for ( t = x; t; t = NEXT(t) ) ndv_dehomogenize((NDV)BDY(t),ord);
Line 2917  void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct 
Line 2926  void nd_gr(LIST f,LIST v,int m,int homo,int f4,struct 
                 nd_setup_parameters(nvar,0);                  nd_setup_parameters(nvar,0);
         }          }
     nd_demand = 0;      nd_demand = 0;
           if ( nd_module && nd_intersect ) {
                   for ( j = nd_psn-1, x = 0; j >= 0; j-- )
                           if ( MPOS(DL(nd_psh[j])) > 1 ) {
                                   MKNODE(xx,(pointer)j,x); x = xx;
                           }
             conv_ilist(nd_demand,0,x,0);
             goto FINAL;
           }
     x = ndv_reducebase(x,perm);      x = ndv_reducebase(x,perm);
     if ( nd_gentrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; }      if ( nd_gentrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; }
     x = ndv_reduceall(m,x);      x = ndv_reduceall(m,x);
       cbpe = nd_bpe;
     if ( nd_gentrace ) {      if ( nd_gentrace ) {
         tl2 = nd_alltracelist; nd_alltracelist = 0;          tl2 = nd_alltracelist; nd_alltracelist = 0;
         ndv_check_membership(m,fd0,obpe,oadv,oepos,x);          ndv_check_membership(m,fd0,obpe,oadv,oepos,x);
         if ( nd_gentrace ) {          if ( nd_gentrace ) {
             tl3 = nd_alltracelist; nd_alltracelist = 0;              tl3 = nd_alltracelist; nd_alltracelist = 0;
         } else tl3 = 0;          } else tl3 = 0;
         nd_gb(m,0,1,nd_gensyz?1:0,0)!=0;          nd_gb(m,0,1,nd_gensyz?1:0,0);
         if ( nd_gentrace && nd_gensyz ) {          if ( nd_gentrace && nd_gensyz ) {
             tl4 = nd_alltracelist; nd_alltracelist = 0;              tl4 = nd_alltracelist; nd_alltracelist = 0;
         } else tl4 = 0;          } else tl4 = 0;
     }      }
       nd_bpe = cbpe;
       nd_setup_parameters(nd_nvar,0);
   FINAL:
     for ( r0 = 0, t = x; t; t = NEXT(t) ) {      for ( r0 = 0, t = x; t; t = NEXT(t) ) {
         NEXTNODE(r0,r);          NEXTNODE(r0,r);
     if ( nd_module ) BDY(r) = ndvtopl(m,CO,vv,BDY(t),mrank);          if ( nd_module ) BDY(r) = ndvtopl(m,CO,vv,BDY(t),mrank);
         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;
Line 4928  EPOS nd_create_epos(struct order_spec *ord)
Line 4949  EPOS nd_create_epos(struct order_spec *ord)
   
 /* external interface */  /* external interface */
   
 void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec *ord,P *rp)  void nd_nf_p(Obj f,LIST g,LIST v,int m,struct order_spec *ord,Obj *rp)
 {  {
     NODE t,in0,in;      NODE t,in0,in;
     ND nd,nf;      ND ndf,nf;
     NDV ndv;      NDV ndvf;
     VL vv,tv;      VL vv,tv;
     int stat,nvar,max,e;      int stat,nvar,max,mrank;
     union oNDC dn;      union oNDC dn;
     Q cont;      Q cont;
     P pp;      P pp;
       LIST ppl;
   
     if ( !f ) {      if ( !f ) {
         *rp = 0;          *rp = 0;
Line 4946  void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec
Line 4968  void nd_nf_p(P f,LIST g,LIST v,int m,struct order_spec
     pltovl(v,&vv);      pltovl(v,&vv);
     for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ );      for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ );
   
     /* get the degree bound */      /* max=65536 implies nd_bpe=32 */
     for ( t = BDY(g), max = 1; t; t = NEXT(t) )      max = 65536;
         for ( tv = vv; tv; tv = NEXT(tv) ) {  
             e = getdeg(tv->v,(P)BDY(t));  
             max = MAX(e,max);  
         }  
     for ( tv = vv; tv; tv = NEXT(tv) ) {  
         e = getdeg(tv->v,f);  
         max = MAX(e,max);  
     }  
   
           nd_module = 0;
           /* nd_module will be set if ord is a module ordering */
     nd_init_ord(ord);      nd_init_ord(ord);
     nd_setup_parameters(nvar,max);      nd_setup_parameters(nvar,max);
       if ( nd_module && OID(f) != O_LIST )
           error("nd_nf_p : the first argument must be a list");
           if ( nd_module ) mrank = length(BDY((LIST)f));
     /* conversion to ndv */      /* conversion to ndv */
     for ( in0 = 0, t = BDY(g); t; t = NEXT(t) ) {      for ( in0 = 0, t = BDY(g); t; t = NEXT(t) ) {
         NEXTNODE(in0,in);          NEXTNODE(in0,in);
         ptozp((P)BDY(t),1,&cont,&pp);          if ( nd_module ) {
         BDY(in) = (pointer)ptondv(CO,vv,pp);            if ( !BDY(t) || OID(BDY(t)) != O_LIST
                  || length(BDY((LIST)BDY(t))) != mrank )
                 error("nd_nf_p : inconsistent basis element");
             if ( !m ) pltozpl((LIST)BDY(t),&cont,&ppl);
             else ppl = (LIST)BDY(t);
             BDY(in) = (pointer)pltondv(CO,vv,ppl);
           } else {
             if ( !m ) ptozp((P)BDY(t),1,&cont,&pp);
             else pp = (P)BDY(t);
             BDY(in) = (pointer)ptondv(CO,vv,pp);
           }
         if ( m ) ndv_mod(m,(NDV)BDY(in));          if ( m ) ndv_mod(m,(NDV)BDY(in));
     }      }
     NEXTNODE(in0,in);      if ( in0 ) NEXT(in) = 0;
     BDY(in) = (pointer)ptondv(CO,vv,f);  
     if ( m ) ndv_mod(m,(NDV)BDY(in));  
     NEXT(in) = 0;  
   
       if ( nd_module ) ndvf = pltondv(CO,vv,(LIST)f);
       else ndvf = ptondv(CO,vv,(P)f);
       if ( m ) ndv_mod(m,ndvf);
       ndf = (pointer)ndvtond(m,ndvf);
   
     /* dont sort, dont removecont */      /* dont sort, dont removecont */
     ndv_setup(m,0,in0,1,1);      ndv_setup(m,0,in0,1,1);
     nd_psn--;  
     nd_scale=2;      nd_scale=2;
     while ( 1 ) {      stat = nd_nf(m,0,ndf,nd_ps,1,0,&nf);
         nd = (pointer)ndvtond(m,nd_ps[nd_psn]);      if ( !stat )
         stat = nd_nf(m,0,nd,nd_ps,1,0,&nf);          error("nd_nf_p : exponent too large");
         if ( !stat ) {      if ( nd_module ) *rp = (Obj)ndvtopl(m,CO,vv,ndtondv(m,nf),mrank);
             nd_psn++;      else *rp = (Obj)ndvtop(m,CO,vv,ndtondv(m,nf));
             nd_reconstruct(0,0);  
             nd_psn--;  
         } else  
             break;  
     }  
     *rp = ndvtop(m,CO,vv,ndtondv(m,nf));  
 }  }
   
 int nd_to_vect(int mod,UINT *s0,int n,ND d,UINT *r)  int nd_to_vect(int mod,UINT *s0,int n,ND d,UINT *r)
Line 6600  void nd_det(int mod,MAT f,P *rp)
Line 6623  void nd_det(int mod,MAT f,P *rp)
                 bucket = create_pbucket();                  bucket = create_pbucket();
                 if ( mi[k] ) {                  if ( mi[k] ) {
                     nmv = BDY(mjj); len = LEN(mjj);                      nmv = BDY(mjj); len = LEN(mjj);
                                         fprintf(stderr,"len=%d\n",len);  
                     for ( a = 0; a < len; a++, NMV_ADV(nmv) ) {                      for ( a = 0; a < len; a++, NMV_ADV(nmv) ) {
                                                 fprintf(stderr,".");  
                         u = ndv_mul_nmv_trunc(mod,nmv,mi[k],DL(BDY(d)));                          u = ndv_mul_nmv_trunc(mod,nmv,mi[k],DL(BDY(d)));
                         add_pbucket(mod,bucket,u);                          add_pbucket(mod,bucket,u);
                                                 if ( !(a%1000) )  
                                                         fprintf(stderr,"%d\n",a);  
                     }                      }
                 }                  }
                 if ( mj[k] && mij ) {                  if ( mj[k] && mij ) {
                     nmv = BDY(mij); len = LEN(mij);                      nmv = BDY(mij); len = LEN(mij);
                                         fprintf(stderr,"len=%d\n",len);  
                     for ( a = 0; a < len; a++, NMV_ADV(nmv) ) {                      for ( a = 0; a < len; a++, NMV_ADV(nmv) ) {
                                                 fprintf(stderr,".");  
                         u = ndv_mul_nmv_trunc(mod,nmv,mj[k],DL(BDY(d)));                          u = ndv_mul_nmv_trunc(mod,nmv,mj[k],DL(BDY(d)));
                         add_pbucket(mod,bucket,u);                          add_pbucket(mod,bucket,u);
                                                 if ( !(a%1000) )  
                                                         fprintf(stderr,"%d\n",a);  
                     }                      }
                 }                  }
                 u = nd_quo(mod,bucket,d);                  u = nd_quo(mod,bucket,d);
Line 6918  void finalize_tracelist(int i,P cont)
Line 6933  void finalize_tracelist(int i,P cont)
      Q iq;       Q iq;
   
          if ( !UNIQ(cont) ) {           if ( !UNIQ(cont) ) {
          node = mknode(4,0,0,0,cont);           node = mknode(4,NULLP,NULLP,NULLP,cont);
          MKLIST(l,node); MKNODE(node,l,nd_tracelist);           MKLIST(l,node); MKNODE(node,l,nd_tracelist);
                  nd_tracelist = node;                   nd_tracelist = node;
          }           }
Line 6953  void parse_nd_option(NODE opt)
Line 6968  void parse_nd_option(NODE opt)
     Obj value;      Obj value;
   
     nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; nd_gbblock = 0;      nd_gentrace = 0; nd_gensyz = 0; nd_nora = 0; nd_gbblock = 0;
           nd_newelim = 0; nd_intersect = 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));
         key = BDY((STRING)BDY(p));          key = BDY((STRING)BDY(p));
Line 6967  void parse_nd_option(NODE opt)
Line 6983  void parse_nd_option(NODE opt)
                         if ( !value || OID(value) != O_LIST )                          if ( !value || OID(value) != O_LIST )
                                 error("nd_* : invalid value for gbblock option");                                  error("nd_* : invalid value for gbblock option");
                         u = BDY((LIST)value);                          u = BDY((LIST)value);
             nd_gbblock = MALLOC(2*length(t)+1);              nd_gbblock = MALLOC((2*length(u)+1)*sizeof(int));
                         for ( i = 0; u; u = NEXT(u) ) {                          for ( i = 0; u; u = NEXT(u) ) {
                                 p = BDY((LIST)BDY(u));                                  p = BDY((LIST)BDY(u));
                                 s = nd_gbblock[i++] = QTOS((Q)BDY(p));                                  s = nd_gbblock[i++] = QTOS((Q)BDY(p));
                                 nd_gbblock[i++] = s+QTOS((Q)BDY(NEXT(p)))-1;                                  nd_gbblock[i++] = s+QTOS((Q)BDY(NEXT(p)))-1;
                         }                          }
                         nd_gbblock[i] = -1;                          nd_gbblock[i] = -1;
                 }                  } else if ( !strcmp(key,"newelim") )
               nd_newelim = value?1:0;
                   else if ( !strcmp(key,"intersect") )
               nd_intersect = value?1:0;
     }      }
 }  }

Legend:
Removed from v.1.188  
changed lines
  Added in v.1.196

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