[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.168 and 1.172

version 1.168, 2009/02/09 10:21:29 version 1.172, 2009/02/15 03:07:41
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.167 2009/02/08 02:47:09 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.171 2009/02/11 06:30:21 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;  static int nd_module,nd_ispot,nd_mpos;
 static NODE nd_tracelist;  static NODE nd_tracelist;
 static NODE nd_alltracelist;  static NODE nd_alltracelist;
   static int nd_gentrace,nd_gensyz;
   
 NumberField get_numberfield();  NumberField get_numberfield();
 UINT *nd_det_compute_bound(NDV **dm,int n,int j);  UINT *nd_det_compute_bound(NDV **dm,int n,int j);
Line 67  P ndc_div(int mod,union oNDC a,union oNDC b);
Line 68  P ndc_div(int mod,union oNDC a,union oNDC b);
 P ndctop(int mod,union oNDC c);  P ndctop(int mod,union oNDC c);
 void finalize_tracelist(int i,P cont);  void finalize_tracelist(int i,P cont);
 void conv_ilist(int demand,int trace,NODE g,int **indp);  void conv_ilist(int demand,int trace,NODE g,int **indp);
   void parse_nd_option(NODE opt);
   
 extern int Denominator,DP_Multiple;  extern int Denominator,DP_Multiple;
   
Line 1325  int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND
Line 1327  int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND
             p = nd_demand ? ndv_load(index) : ps[index];              p = nd_demand ? ndv_load(index) : ps[index];
             /* d+g -> div*(d+g)+mul*p */              /* d+g -> div*(d+g)+mul*p */
             g = nd_reduce2(mod,d,g,p,mul,dn,&div);              g = nd_reduce2(mod,d,g,p,mul,dn,&div);
             if ( GenTrace ) {              if ( nd_gentrace ) {
                 /* Trace=[div,index,mul,ONE] */                  /* Trace=[div,index,mul,ONE] */
                 STOQ(index,iq);                  STOQ(index,iq);
                 nmtodp(mod,mul,&dmul);                  nmtodp(mod,mul,&dmul);
Line 1335  int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND
Line 1337  int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND
             if ( !mod && g && ((double)(p_mag(HCP(g))) > hmag) ) {              if ( !mod && g && ((double)(p_mag(HCP(g))) > hmag) ) {
                 hg = HCU(g);                  hg = HCU(g);
                 nd_removecont2(d,g);                  nd_removecont2(d,g);
                 if ( dn || GenTrace ) {                  if ( dn || nd_gentrace ) {
                     /* overwrite cont : Trace=[div,index,mul,cont] */                      /* overwrite cont : Trace=[div,index,mul,cont] */
                     cont = ndc_div(mod,hg,HCU(g));                      cont = ndc_div(mod,hg,HCU(g));
                     if ( dn ) {                      if ( dn ) {
Line 1344  int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND
Line 1346  int nd_nf(int mod,ND d,ND g,NDV *ps,int full,NDC dn,ND
                             reductr(nd_vc,(Obj)tr,&tr1); dn->r = (R)tr1;                              reductr(nd_vc,(Obj)tr,&tr1); dn->r = (R)tr1;
                         } else divq(dn->z,(Q)cont,&dn->z);                          } else divq(dn->z,(Q)cont,&dn->z);
                     }                      }
                     if ( GenTrace && !UNIQ(cont) ) ARG3(node) = (pointer)cont;                      if ( nd_gentrace && !UNIQ(cont) ) ARG3(node) = (pointer)cont;
                 }                  }
                 hmag = ((double)p_mag(HCP(g)))*nd_scale;                  hmag = ((double)p_mag(HCP(g)))*nd_scale;
             }              }
Line 1476  int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp
Line 1478  int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp
   
 /* input : list of NDV, cand : list of NDV */  /* input : list of NDV, cand : list of NDV */
   
 int ndv_check_candidate(NODE input,int obpe,int oadv,EPOS oepos,NODE cand)  int ndv_check_membership(int m,NODE input,int obpe,int oadv,EPOS oepos,NODE cand)
 {  {
     int n,i,stat;      int n,i,stat;
     ND nf,d;      ND nf,d;
Line 1486  int ndv_check_candidate(NODE input,int obpe,int oadv,E
Line 1488  int ndv_check_candidate(NODE input,int obpe,int oadv,E
     Q q;      Q q;
     LIST list;      LIST list;
   
     ndv_setup(0,0,cand,GenTrace?1:0,1);      ndv_setup(m,0,cand,nd_gentrace?1:0,1);
     n = length(cand);      n = length(cand);
   
         if ( GenTrace ) { nd_alltracelist = 0; nd_tracelist = 0; }          if ( nd_gentrace ) { nd_alltracelist = 0; nd_tracelist = 0; }
     /* membercheck : list is a subset of Id(cand) ? */      /* membercheck : list is a subset of Id(cand) ? */
     for ( t = input, i = 0; t; t = NEXT(t), i++ ) {      for ( t = input, i = 0; t; t = NEXT(t), i++ ) {
 again:  again:
Line 1498  again:
Line 1500  again:
             r = ndv_dup_realloc((NDV)BDY(t),obpe,oadv,oepos);              r = ndv_dup_realloc((NDV)BDY(t),obpe,oadv,oepos);
         else          else
             r = (NDV)BDY(t);              r = (NDV)BDY(t);
         d = ndvtond(0,r);          d = ndvtond(m,r);
         stat = nd_nf(0,0,d,nd_ps,0,0,&nf);          stat = nd_nf(m,0,d,nd_ps,0,0,&nf);
         if ( !stat ) {          if ( !stat ) {
             nd_reconstruct(0,0);              nd_reconstruct(0,0);
             goto again;              goto again;
         } else if ( nf ) return 0;          } else if ( nf ) return 0;
                 if ( GenTrace ) {                  if ( nd_gentrace ) {
                         nd_tracelist = reverse_node(nd_tracelist);                          nd_tracelist = reverse_node(nd_tracelist);
                         MKLIST(list,nd_tracelist);                          MKLIST(list,nd_tracelist);
                         STOQ(i,q); s = mknode(2,q,list); MKLIST(list,s);                          STOQ(i,q); s = mknode(2,q,list); MKLIST(list,s);
Line 1821  int do_diagonalize(int sugar,int m)
Line 1823  int do_diagonalize(int sugar,int m)
     Q iq;      Q iq;
   
     for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) {      for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) {
         if ( GenTrace ) {          if ( nd_gentrace ) {
             /* Trace = [1,index,1,1] */              /* Trace = [1,index,1,1] */
             STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE);              STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE);
             MKLIST(l,node); MKNODE(nd_tracelist,l,0);              MKLIST(l,node); MKNODE(nd_tracelist,l,0);
Line 1837  int do_diagonalize(int sugar,int m)
Line 1839  int do_diagonalize(int sugar,int m)
         ndv_free(nfv);          ndv_free(nfv);
         hc = HCU(nf); nd_removecont(m,nf);          hc = HCU(nf); nd_removecont(m,nf);
         cont = ndc_div(m,hc,HCU(nf));          cont = ndc_div(m,hc,HCU(nf));
                 if ( GenTrace ) finalize_tracelist(i,cont);                  if ( nd_gentrace ) finalize_tracelist(i,cont);
         nfv = ndtondv(m,nf);          nfv = ndtondv(m,nf);
         nd_free(nf);          nd_free(nf);
         nd_bound[i] = ndv_compute_bound(nfv);          nd_bound[i] = ndv_compute_bound(nfv);
Line 1896  again:
Line 1898  again:
             goto again;              goto again;
         }          }
 #if USE_GEOBUCKET  #if USE_GEOBUCKET
         stat = (m&&!GenTrace)?nd_nf_pbucket(m,h,nd_ps,!Top,&nf)          stat = (m&&!nd_gentrace)?nd_nf_pbucket(m,h,nd_ps,!Top,&nf)
                :nd_nf(m,0,h,nd_ps,!Top,0,&nf);                 :nd_nf(m,0,h,nd_ps,!Top,0,&nf);
 #else  #else
         stat = nd_nf(m,0,h,nd_ps,!Top,0,&nf);          stat = nd_nf(m,0,h,nd_ps,!Top,0,&nf);
Line 1914  again:
Line 1916  again:
                 nd_monic(0,&nf);                  nd_monic(0,&nf);
                 nd_removecont(m,nf);                  nd_removecont(m,nf);
             }              }
             if ( 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,0,0,0,cont);
Line 1937  again:
Line 1939  again:
             g = update_base(g,nh);              g = update_base(g,nh);
             FREENDP(l);              FREENDP(l);
         } else {          } else {
                     if ( GenTrace && gensyz ) {                      if ( nd_gentrace && gensyz ) {
                 nd_tracelist = reverse_node(nd_tracelist);                  nd_tracelist = reverse_node(nd_tracelist);
                                 MKLIST(list,nd_tracelist);                                  MKLIST(list,nd_tracelist);
                 STOQ(-1,q); t = mknode(2,q,list); MKLIST(list,t);                  STOQ(-1,q); t = mknode(2,q,list); MKLIST(list,t);
Line 1967  int do_diagonalize_trace(int sugar,int m)
Line 1969  int do_diagonalize_trace(int sugar,int m)
     P cont,cont1;      P cont,cont1;
   
     for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) {      for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) {
         if ( GenTrace ) {          if ( nd_gentrace ) {
             /* Trace = [1,index,1,1] */              /* Trace = [1,index,1,1] */
             STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE);              STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE);
             MKLIST(l,node); MKNODE(nd_tracelist,l,0);              MKLIST(l,node); MKNODE(nd_tracelist,l,0);
Line 1994  int do_diagonalize_trace(int sugar,int m)
Line 1996  int do_diagonalize_trace(int sugar,int m)
         ndv_free(nfv);          ndv_free(nfv);
         hc = HCU(nf); nd_removecont(0,nf);          hc = HCU(nf); nd_removecont(0,nf);
                 cont = ndc_div(0,hc,HCU(nf));                  cont = ndc_div(0,hc,HCU(nf));
         if ( GenTrace ) finalize_tracelist(i,cont);          if ( nd_gentrace ) finalize_tracelist(i,cont);
         nfv = ndtondv(0,nf);          nfv = ndtondv(0,nf);
         nd_free(nf);          nd_free(nf);
         nd_bound[i] = ndv_compute_bound(nfv);          nd_bound[i] = ndv_compute_bound(nfv);
Line 2116  again:
Line 2118  again:
                     nd_removecont(0,nfq); nfqv = ndtondv(0,nfq); nd_free(nfq);                      nd_removecont(0,nfq); nfqv = ndtondv(0,nfq); nd_free(nfq);
                     nd_removecont(m,nf); nfv = ndtondv(m,nf); nd_free(nf);                      nd_removecont(m,nf); nfv = ndtondv(m,nf); nd_free(nf);
                 }                  }
                 if ( 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,0,0,0,cont);
Line 2193  NODE ndv_reduceall(int m,NODE f)
Line 2195  NODE ndv_reduceall(int m,NODE f)
     n = length(f);      n = length(f);
     ndv_setup(m,0,f,0,1);      ndv_setup(m,0,f,0,1);
         perm = (int *)MALLOC(n*sizeof(int));          perm = (int *)MALLOC(n*sizeof(int));
         if ( GenTrace ) {          if ( nd_gentrace ) {
             for ( t = nd_tracelist, i = 0; i < n; i++, t = NEXT(t) )              for ( t = nd_tracelist, i = 0; i < n; i++, t = NEXT(t) )
                     perm[i] = QTOS((Q)ARG1(BDY((LIST)BDY(t))));                      perm[i] = QTOS((Q)ARG1(BDY((LIST)BDY(t))));
         }          }
     for ( i = 0; i < n; ) {      for ( i = 0; i < n; ) {
         if ( GenTrace ) {          if ( nd_gentrace ) {
             /* Trace = [1,index,1,1] */              /* Trace = [1,index,1,1] */
             STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE);              STOQ(i,iq); node = mknode(4,ONE,iq,ONE,ONE);
             MKLIST(l,node); MKNODE(nd_tracelist,l,0);              MKLIST(l,node); MKNODE(nd_tracelist,l,0);
Line 2212  NODE ndv_reduceall(int m,NODE f)
Line 2214  NODE ndv_reduceall(int m,NODE f)
             if ( DP_Print ) { printf("."); fflush(stdout); }              if ( DP_Print ) { printf("."); fflush(stdout); }
             ndv_free(nd_ps[i]);              ndv_free(nd_ps[i]);
             hc = HCU(nf); nd_removecont(m,nf);              hc = HCU(nf); nd_removecont(m,nf);
             if ( GenTrace ) {              if ( nd_gentrace ) {
                                 for ( t = nd_tracelist; t; t = NEXT(t) ) {                                  for ( t = nd_tracelist; t; t = NEXT(t) ) {
                     jq = ARG1(BDY((LIST)BDY(t))); j = QTOS(jq);                      jq = ARG1(BDY((LIST)BDY(t))); j = QTOS(jq);
                     STOQ(perm[j],jq); ARG1(BDY((LIST)BDY(t))) = jq;                      STOQ(perm[j],jq); ARG1(BDY((LIST)BDY(t))) = jq;
Line 2228  NODE ndv_reduceall(int m,NODE f)
Line 2230  NODE ndv_reduceall(int m,NODE f)
     if ( DP_Print ) { printf("\n"); }      if ( DP_Print ) { printf("\n"); }
     for ( a0 = 0, i = 0; i < n; i++ ) {      for ( a0 = 0, i = 0; i < n; i++ ) {
         NEXTNODE(a0,a);          NEXTNODE(a0,a);
                 if ( !GenTrace ) BDY(a) = (pointer)nd_ps[i];                  if ( !nd_gentrace ) BDY(a) = (pointer)nd_ps[i];
                 else {                  else {
                         for ( j = 0; j < n; j++ ) if ( perm[j] == i ) break;                          for ( j = 0; j < n; j++ ) if ( perm[j] == i ) break;
                         BDY(a) = (pointer)nd_ps[j];                          BDY(a) = (pointer)nd_ps[j];
Line 2244  ND_pairs update_pairs( ND_pairs d, NODE /* of index */
Line 2246  ND_pairs update_pairs( ND_pairs d, NODE /* of index */
   
     if ( !g ) return d;      if ( !g ) return d;
         /* for testing */          /* for testing */
         if ( gensyz && GenSyz == 2 ) {          if ( gensyz && nd_gensyz == 2 ) {
         d1 = nd_newpairs(g,t);          d1 = nd_newpairs(g,t);
         if ( !d )          if ( !d )
          return d1;           return d1;
Line 2573  int ndv_newps(int m,NDV a,NDV aq)
Line 2575  int ndv_newps(int m,NDV a,NDV aq)
             nd_ps[nd_psn] = 0;              nd_ps[nd_psn] = 0;
         }          }
     }      }
     if ( GenTrace ) {      if ( nd_gentrace ) {
         /* reverse the tracelist and append it to alltracelist */          /* reverse the tracelist and append it to alltracelist */
         nd_tracelist = reverse_node(nd_tracelist); MKLIST(l,nd_tracelist);          nd_tracelist = reverse_node(nd_tracelist); MKLIST(l,nd_tracelist);
         STOQ(nd_psn,iq); tn = mknode(2,iq,l); MKLIST(l,tn);          STOQ(nd_psn,iq); tn = mknode(2,iq,l); MKLIST(l,tn);
Line 2644  void ndv_setup(int mod,int trace,NODE f,int dont_sort,
Line 2646  void ndv_setup(int mod,int trace,NODE f,int dont_sort,
             if ( mod || !dont_removecont ) ndv_removecont(mod,a);              if ( mod || !dont_removecont ) ndv_removecont(mod,a);
             if ( !mod ) register_hcf(a);              if ( !mod ) register_hcf(a);
         }          }
         if ( GenTrace ) {          if ( nd_gentrace ) {
             STOQ(i,iq); STOQ(w[i].i,jq); node = mknode(3,iq,jq,ONE);              STOQ(i,iq); STOQ(w[i].i,jq); node = mknode(3,iq,jq,ONE);
                         if ( !dont_removecont )                          if ( !dont_removecont )
                 ARG2(node) = (pointer)ndc_div(trace?0:mod,hc,HCU(a));                  ARG2(node) = (pointer)ndc_div(trace?0:mod,hc,HCU(a));
Line 2663  void ndv_setup(int mod,int trace,NODE f,int dont_sort,
Line 2665  void ndv_setup(int mod,int trace,NODE f,int dont_sort,
             }              }
         }          }
     }      }
     if ( GenTrace && nd_tracelist ) NEXT(tn) = 0;      if ( nd_gentrace && nd_tracelist ) NEXT(tn) = 0;
 }  }
   
 struct order_spec *append_block(struct order_spec *spec,  struct order_spec *append_block(struct order_spec *spec,
Line 2785  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2787  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
     Obj obj;      Obj obj;
     NumberField nf;      NumberField nf;
     struct order_spec *ord1;      struct order_spec *ord1;
     NODE tr,tl1,tl2;      NODE tr,tl1,tl2,tl3,tl4;
     LIST l1,l2,l3;      LIST l1,l2,l3,l4,l5;
         int j;          int j;
         Q jq;          Q jq;
     int *perm;      int *perm;
       EPOS oepos;
       int obpe,oadv,ompos;
   
     nd_module = 0;      nd_module;
     if ( !m && Demand ) nd_demand = 1;      if ( !m && Demand ) nd_demand = 1;
     else nd_demand = 0;      else nd_demand = 0;
       parse_nd_option(current_option);
   
     if ( DP_Multiple )      if ( DP_Multiple )
         nd_scale = ((double)DP_Multiple)/(double)(Denominator?Denominator:1);          nd_scale = ((double)DP_Multiple)/(double)(Denominator?Denominator:1);
Line 2843  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2848  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
             }              }
         }          }
     nd_setup_parameters(nvar,max);      nd_setup_parameters(nvar,max);
       obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos; ompos = nd_mpos;
     ishomo = 1;      ishomo = 1;
     for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {      for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
         if ( nd_module ) {          if ( nd_module ) {
                         if ( !m && !GenTrace ) pltozpl((LIST)BDY(t),&dmy,&zpl);                          if ( !m && !nd_gentrace ) pltozpl((LIST)BDY(t),&dmy,&zpl);
                         else zpl = (LIST)BDY(t);                          else zpl = (LIST)BDY(t);
             b = (pointer)pltondv(CO,vv,zpl);              b = (pointer)pltondv(CO,vv,zpl);
         } else {          } else {
                         if ( !m && !GenTrace ) ptozp((P)BDY(t),1,&dmy,&zp);                          if ( !m && !nd_gentrace ) ptozp((P)BDY(t),1,&dmy,&zp);
                         else zp = (P)BDY(t);                          else zp = (P)BDY(t);
             b = (pointer)ptondv(CO,vv,zp);              b = (pointer)ptondv(CO,vv,zp);
         }          }
Line 2861  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2867  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
     }      }
     if ( fd0 ) NEXT(fd) = 0;      if ( fd0 ) NEXT(fd) = 0;
     ndv_setup(m,0,fd0,0,0);      ndv_setup(m,0,fd0,0,0);
     if ( GenTrace ) {      if ( nd_gentrace ) {
         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,0,0,&perm);      x = f4?nd_f4(m,&perm):nd_gb(m,ishomo,0,0,&perm);
     nd_demand = 0;      nd_demand = 0;
     x = ndv_reducebase(x,perm);      x = ndv_reducebase(x,perm);
     if ( 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);
       if ( nd_gentrace ) {
           tl2 = nd_alltracelist; nd_alltracelist = 0;
           ndv_check_membership(m,fd0,obpe,oadv,oepos,x);
           if ( nd_gentrace ) {
               tl3 = nd_alltracelist; nd_alltracelist = 0;
           } else tl3 = 0;
           nd_gb(m,0,1,nd_gensyz?1:0,0)!=0;
           if ( nd_gentrace && nd_gensyz ) {
               tl4 = nd_alltracelist; nd_alltracelist = 0;
           } else tl4 = 0;
       }
     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);
Line 2878  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2895  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
     if ( nalg )      if ( nalg )
         r0 = postprocess_algcoef(av,alist,r0);          r0 = postprocess_algcoef(av,alist,r0);
     MKLIST(*rp,r0);      MKLIST(*rp,r0);
     if ( GenTrace ) {      if ( nd_gentrace ) {
         tl2 = nd_alltracelist; nd_alltracelist = 0;  
         tl1 = reverse_node(tl1); tl2 = reverse_node(tl2);          tl1 = reverse_node(tl1); tl2 = reverse_node(tl2);
           tl3 = reverse_node(tl3);
                 /* tl2 = [[i,[[*,j,*,*],...]],...] */                  /* tl2 = [[i,[[*,j,*,*],...]],...] */
         for ( t = tl2; t; t = NEXT(t) ) {          for ( t = tl2; t; t = NEXT(t) ) {
                         /* s = [i,[*,j,*,*],...] */                          /* s = [i,[*,j,*,*],...] */
Line 2894  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2911  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
                 for ( j = length(x)-1, t = 0; j >= 0; j-- ) {                  for ( j = length(x)-1, t = 0; j >= 0; j-- ) {
                     STOQ(perm[j],jq); MKNODE(s,jq,t); t = s;                      STOQ(perm[j],jq); MKNODE(s,jq,t); t = s;
                 }                  }
         MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t);         MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t); MKLIST(l4,tl3);
         tr = mknode(5,*rp,0,l1,l2,l3); MKLIST(*rp,tr);         MKLIST(l5,tl4);
         tr = mknode(7,*rp,0,l1,l2,l3,l4,l5); MKLIST(*rp,tr);
     }      }
 #if 0  #if 0
     fprintf(asir_out,"ndv_alloc=%d\n",ndv_alloc);      fprintf(asir_out,"ndv_alloc=%d\n",ndv_alloc);
Line 3010  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3028  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
     Q jq;      Q jq;
   
     nd_module = 0;      nd_module = 0;
       parse_nd_option(current_option);
     if ( DP_Multiple )      if ( DP_Multiple )
         nd_scale = ((double)DP_Multiple)/(double)(Denominator?Denominator:1);          nd_scale = ((double)DP_Multiple)/(double)(Denominator?Denominator:1);
   
Line 3070  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3089  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
     ishomo = 1;      ishomo = 1;
     for ( in0 = 0, fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {      for ( in0 = 0, fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
         if ( nd_module ) {          if ( nd_module ) {
                         if ( !GenTrace ) pltozpl((LIST)BDY(t),&dmy,&zpl);                          if ( !nd_gentrace ) pltozpl((LIST)BDY(t),&dmy,&zpl);
                         else zpl = (LIST)BDY(t);                          else zpl = (LIST)BDY(t);
             c = (pointer)pltondv(CO,vv,zpl);              c = (pointer)pltondv(CO,vv,zpl);
         } else {          } else {
                         if ( !GenTrace ) ptozp((P)BDY(t),1,&dmy,&zp);                          if ( !nd_gentrace ) ptozp((P)BDY(t),1,&dmy,&zp);
                         else zp = (P)BDY(t);                          else zp = (P)BDY(t);
             c = (pointer)ptondv(CO,vv,zp);              c = (pointer)ptondv(CO,vv,zp);
         }          }
Line 3103  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3122  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
         if ( Demand )          if ( Demand )
             nd_demand = 1;              nd_demand = 1;
         ndv_setup(m,1,fd0,0,0);          ndv_setup(m,1,fd0,0,0);
         if ( GenTrace ) {          if ( nd_gentrace ) {
             MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0);              MKLIST(l1,nd_tracelist); MKNODE(nd_alltracelist,l1,0);
         }          }
         cand = f4?nd_f4_trace(m,&perm):nd_gb_trace(m,ishomo || homo,&perm);          cand = f4?nd_f4_trace(m,&perm):nd_gb_trace(m,ishomo || homo,&perm);
Line 3121  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3140  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
         }          }
         nd_demand = 0;          nd_demand = 0;
         cand = ndv_reducebase(cand,perm);          cand = ndv_reducebase(cand,perm);
         if ( GenTrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; }          if ( nd_gentrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; }
         cand = ndv_reduceall(0,cand);          cand = ndv_reduceall(0,cand);
         cbpe = nd_bpe;          cbpe = nd_bpe;
         if ( GenTrace ) { tl2 = nd_alltracelist; nd_alltracelist = 0; }          if ( nd_gentrace ) { tl2 = nd_alltracelist; nd_alltracelist = 0; }
         if ( nocheck )          if ( nocheck )
             break;              break;
         get_eg(&eg0);          get_eg(&eg0);
         if ( ret = ndv_check_candidate(in0,obpe,oadv,oepos,cand) ) {          if ( ret = ndv_check_membership(0,in0,obpe,oadv,oepos,cand) ) {
             if ( GenTrace ) {              if ( nd_gentrace ) {
                             tl3 = nd_alltracelist; nd_alltracelist = 0;                              tl3 = nd_alltracelist; nd_alltracelist = 0;
                     } else tl3 = 0;                      } else tl3 = 0;
             /* gbcheck : cand is a GB of Id(cand) ? */              /* gbcheck : cand is a GB of Id(cand) ? */
             ret = nd_gb(0,0,1,GenSyz?1:0,0)!=0;              ret = nd_gb(0,0,1,nd_gensyz?1:0,0)!=0;
             if ( GenTrace && GenSyz ) {              if ( nd_gentrace && nd_gensyz ) {
                             tl4 = nd_alltracelist; nd_alltracelist = 0;                              tl4 = nd_alltracelist; nd_alltracelist = 0;
                     } else tl4 = 0;                      } else tl4 = 0;
                 }                  }
Line 3168  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3187  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
     if ( nalg )      if ( nalg )
         cand = postprocess_algcoef(av,alist,cand);          cand = postprocess_algcoef(av,alist,cand);
     MKLIST(*rp,cand);      MKLIST(*rp,cand);
     if ( GenTrace ) {      if ( nd_gentrace ) {
         tl1 = reverse_node(tl1); tl2 = reverse_node(tl2);          tl1 = reverse_node(tl1); tl2 = reverse_node(tl2);
                 tl3 = reverse_node(tl3);                  tl3 = reverse_node(tl3);
                 /* tl2 = [[i,[[*,j,*,*],...]],...] */                  /* tl2 = [[i,[[*,j,*,*],...]],...] */
Line 3186  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3205  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
                 }                  }
         MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t); MKLIST(l4,tl3);          MKLIST(l1,tl1); MKLIST(l2,tl2); MKLIST(l3,t); MKLIST(l4,tl3);
                 MKLIST(l5,tl4);                  MKLIST(l5,tl4);
         tr = mknode(7,*rp,homo?ONE:0,l1,l2,l3,l4,l5); MKLIST(*rp,tr);          tr = mknode(7,*rp,(!ishomo&&homo)?ONE:0,l1,l2,l3,l4,l5); MKLIST(*rp,tr);
     }      }
 }  }
   
Line 3914  int nd_sp(int mod,int trace,ND_pairs p,ND *rp)
Line 3933  int nd_sp(int mod,int trace,ND_pairs p,ND *rp)
     }      }
     t1 = ndv_mul_nm(mod,m1,p1); t2 = ndv_mul_nm(mod,m2,p2);      t1 = ndv_mul_nm(mod,m1,p1); t2 = ndv_mul_nm(mod,m2,p2);
     *rp = nd_add(mod,t1,t2);      *rp = nd_add(mod,t1,t2);
     if ( GenTrace ) {      if ( nd_gentrace ) {
         /* nd_tracelist is initialized */          /* nd_tracelist is initialized */
         STOQ(p->i1,iq); nmtodp(mod,m1,&d); node = mknode(4,ONE,iq,d,ONE);          STOQ(p->i1,iq); nmtodp(mod,m1,&d); node = mknode(4,ONE,iq,d,ONE);
         MKLIST(hist,node); MKNODE(nd_tracelist,hist,0);          MKLIST(hist,node); MKNODE(nd_tracelist,hist,0);
Line 6773  void conv_ilist(int demand,int trace,NODE g,int **indp
Line 6792  void conv_ilist(int demand,int trace,NODE g,int **indp
                 BDY(t) = (pointer)(demand?ndv_load(j):(trace?nd_ps_trace[j]:nd_ps[j]));                  BDY(t) = (pointer)(demand?ndv_load(j):(trace?nd_ps_trace[j]:nd_ps[j]));
         }          }
         if ( indp ) *indp = ind;          if ( indp ) *indp = ind;
   }
   
   void parse_nd_option(NODE opt)
   {
       NODE t,p;
       char *key;
       Obj value;
   
       nd_gentrace = 0; nd_gensyz = 0;
       for ( t = opt; t; t = NEXT(t) ) {
           p = BDY((LIST)BDY(t));
           key = BDY((STRING)BDY(p));
           value = (Obj)BDY(NEXT(p));
           if ( !strcmp(key,"gentrace") )
               nd_gentrace = value?1:0;
           else if ( !strcmp(key,"gensyz") )
               nd_gensyz = value?1:0;
       }
 }  }

Legend:
Removed from v.1.168  
changed lines
  Added in v.1.172

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