[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.167 and 1.168

version 1.167, 2009/02/08 02:47:09 version 1.168, 2009/02/09 10:21:29
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.166 2009/02/03 08:08:01 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.167 2009/02/08 02:47:09 noro Exp $ */
   
 #include "nd.h"  #include "nd.h"
   
Line 1483  int ndv_check_candidate(NODE input,int obpe,int oadv,E
Line 1483  int ndv_check_candidate(NODE input,int obpe,int oadv,E
     NDV r;      NDV r;
     NODE t,s;      NODE t,s;
     union oNDC dn;      union oNDC dn;
       Q q;
       LIST list;
   
     ndv_setup(0,0,cand,0,1);      ndv_setup(0,0,cand,GenTrace?1:0,1);
     n = length(cand);      n = length(cand);
   
           if ( 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; t; t = NEXT(t) ) {      for ( t = input, i = 0; t; t = NEXT(t), i++ ) {
 again:  again:
                   nd_tracelist = 0;
         if ( nd_bpe > obpe )          if ( nd_bpe > obpe )
             r = ndv_dup_realloc((NDV)BDY(t),obpe,oadv,oepos);              r = ndv_dup_realloc((NDV)BDY(t),obpe,oadv,oepos);
         else          else
Line 1500  again:
Line 1504  again:
             nd_reconstruct(0,0);              nd_reconstruct(0,0);
             goto again;              goto again;
         } else if ( nf ) return 0;          } else if ( nf ) return 0;
                   if ( GenTrace ) {
                           nd_tracelist = reverse_node(nd_tracelist);
                           MKLIST(list,nd_tracelist);
                           STOQ(i,q); s = mknode(2,q,list); MKLIST(list,s);
                           MKNODE(s,list,nd_alltracelist);
                           nd_alltracelist = s; nd_tracelist = 0;
                   }
         if ( DP_Print ) { printf("."); fflush(stdout); }          if ( DP_Print ) { printf("."); fflush(stdout); }
     }      }
     if ( DP_Print ) { printf("\n"); }      if ( DP_Print ) { printf("\n"); }
     /* gbcheck : cand is a GB of Id(cand) ? */  
     if ( !nd_gb(0,0,1,0) ) return 0;  
     /* XXX */  
     return 1;      return 1;
 }  }
   
Line 1845  int do_diagonalize(int sugar,int m)
Line 1853  int do_diagonalize(int sugar,int m)
   
 /* return value = 0 => input is not a GB */  /* return value = 0 => input is not a GB */
   
 NODE nd_gb(int m,int ishomo,int checkonly,int **indp)  NODE nd_gb(int m,int ishomo,int checkonly,int gensyz,int **indp)
 {  {
     int i,nh,sugar,stat;      int i,nh,sugar,stat;
     NODE r,g,t;      NODE r,g,t;
Line 1861  NODE nd_gb(int m,int ishomo,int checkonly,int **indp)
Line 1869  NODE nd_gb(int m,int ishomo,int checkonly,int **indp)
   
     g = 0; d = 0;      g = 0; d = 0;
     for ( i = 0; i < nd_psn; i++ ) {      for ( i = 0; i < nd_psn; i++ ) {
         d = update_pairs(d,g,i);          d = update_pairs(d,g,i,gensyz);
         g = update_base(g,i);          g = update_base(g,i);
     }      }
     sugar = 0;      sugar = 0;
Line 1898  again:
Line 1906  again:
             d = nd_reconstruct(0,d);              d = nd_reconstruct(0,d);
             goto again;              goto again;
         } else if ( nf ) {          } else if ( nf ) {
             if ( checkonly ) return 0;              if ( checkonly || gensyz ) 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 1925  again:
Line 1933  again:
                     goto again;                      goto again;
                 }                  }
             }              }
             d = update_pairs(d,g,nh);              d = update_pairs(d,g,nh,0);
             g = update_base(g,nh);              g = update_base(g,nh);
             FREENDP(l);              FREENDP(l);
         } else {          } else {
                       if ( GenTrace && gensyz ) {
                   nd_tracelist = reverse_node(nd_tracelist);
                                   MKLIST(list,nd_tracelist);
                   STOQ(-1,q); t = mknode(2,q,list); MKLIST(list,t);
                   MKNODE(t,list,nd_alltracelist);
                                   nd_alltracelist = t; nd_tracelist = 0;
                           }
             if ( DP_Print ) { printf("."); fflush(stdout); }              if ( DP_Print ) { printf("."); fflush(stdout); }
             FREENDP(l);              FREENDP(l);
         }          }
Line 2028  NODE nd_gb_trace(int m,int ishomo,int **indp)
Line 2043  NODE nd_gb_trace(int m,int ishomo,int **indp)
     init_eg(&eg_le);      init_eg(&eg_le);
     g = 0; d = 0;      g = 0; d = 0;
     for ( i = 0; i < nd_psn; i++ ) {      for ( i = 0; i < nd_psn; i++ ) {
         d = update_pairs(d,g,i);          d = update_pairs(d,g,i,0);
         g = update_base(g,i);          g = update_base(g,i);
     }      }
     sugar = 0;      sugar = 0;
Line 2121  again:
Line 2136  again:
                         goto again;                          goto again;
                     }                      }
                 }                  }
                 d = update_pairs(d,g,nh);                  d = update_pairs(d,g,nh,0);
                 g = update_base(g,nh);                  g = update_base(g,nh);
             } else {              } else {
                 if ( DP_Print ) { printf("*"); fflush(stdout); }                  if ( DP_Print ) { printf("*"); fflush(stdout); }
Line 2223  NODE ndv_reduceall(int m,NODE f)
Line 2238  NODE ndv_reduceall(int m,NODE f)
     return a0;      return a0;
 }  }
   
 ND_pairs update_pairs( ND_pairs d, NODE /* of index */ g, int t)  ND_pairs update_pairs( ND_pairs d, NODE /* of index */ g, int t, int gensyz)
 {  {
     ND_pairs d1,nd,cur,head,prev,remove;      ND_pairs d1,nd,cur,head,prev,remove;
   
     if ( !g ) return d;      if ( !g ) return d;
           /* for testing */
           if ( gensyz && GenSyz == 2 ) {
           d1 = nd_newpairs(g,t);
           if ( !d )
            return d1;
           else {
            nd = d;
            while ( NEXT(nd) ) nd = NEXT(nd);
            NEXT(nd) = d1;
            return d;
           }
           }
     d = crit_B(d,t);      d = crit_B(d,t);
     d1 = nd_newpairs(g,t);      d1 = nd_newpairs(g,t);
     d1 = crit_M(d1);      d1 = crit_M(d1);
     d1 = crit_F(d1);      d1 = crit_F(d1);
     if ( do_weyl )      if ( gensyz || do_weyl )
         head = d1;          head = d1;
     else {      else {
         prev = 0; cur = head = d1;          prev = 0; cur = head = d1;
Line 2619  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 ( GenTrace ) {          if ( 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);
             ARG2(node) = (pointer)                          if ( !dont_removecont )
                 ndc_div(trace?0:mod,hc,HCU(a));                  ARG2(node) = (pointer)ndc_div(trace?0:mod,hc,HCU(a));
             MKLIST(l,node); NEXTNODE(nd_tracelist,tn); BDY(tn) = l;              MKLIST(l,node); NEXTNODE(nd_tracelist,tn); BDY(tn) = l;
         }          }
         NEWRHist(r); SG(r) = HTD(a); ndl_copy(HDL(a),DL(r));          NEWRHist(r); SG(r) = HTD(a); ndl_copy(HDL(a),DL(r));
Line 2837  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2864  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
     if ( GenTrace ) {      if ( 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,&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 ( GenTrace ) { tl1 = nd_alltracelist; nd_alltracelist = 0; }
Line 2937  void nd_gr_postproc(LIST f,LIST v,int m,struct order_s
Line 2964  void nd_gr_postproc(LIST f,LIST v,int m,struct order_s
     for ( x = 0, i = 0; i < nd_psn; i++ )      for ( x = 0, i = 0; i < nd_psn; i++ )
         x = update_base(x,i);          x = update_base(x,i);
     if ( do_check ) {      if ( do_check ) {
         x = nd_gb(m,ishomo,1,&perm);          x = nd_gb(m,ishomo,1,0,&perm);
         if ( !x ) {          if ( !x ) {
             *rp = 0;              *rp = 0;
             return;              return;
Line 2976  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3003  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
     NumberField nf;      NumberField nf;
     struct order_spec *ord1;      struct order_spec *ord1;
     struct oEGT eg_check,eg0,eg1;      struct oEGT eg_check,eg0,eg1;
     NODE tr,tl1,tl2;      NODE tr,tl1,tl2,tl3,tl4;
     LIST l1,l2,l3;      LIST l1,l2,l3,l4,l5;
     int *perm;      int *perm;
     int j;      int j,ret;
     Q jq;      Q jq;
   
     nd_module = 0;      nd_module = 0;
Line 3101  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3128  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
         if ( nocheck )          if ( nocheck )
             break;              break;
         get_eg(&eg0);          get_eg(&eg0);
         if ( ndv_check_candidate(in0,obpe,oadv,oepos,cand) )          if ( ret = ndv_check_candidate(in0,obpe,oadv,oepos,cand) ) {
             /* success */              if ( GenTrace ) {
             break;                              tl3 = nd_alltracelist; nd_alltracelist = 0;
                       } else tl3 = 0;
               /* gbcheck : cand is a GB of Id(cand) ? */
               ret = nd_gb(0,0,1,GenSyz?1:0,0)!=0;
               if ( GenTrace && GenSyz ) {
                               tl4 = nd_alltracelist; nd_alltracelist = 0;
                       } else tl4 = 0;
                   }
                   if ( ret ) break;
         else if ( trace > 1 ) {          else if ( trace > 1 ) {
             /* failure */              /* failure */
             *rp = 0; return;              *rp = 0; return;
Line 3135  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3170  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
     MKLIST(*rp,cand);      MKLIST(*rp,cand);
     if ( GenTrace ) {      if ( GenTrace ) {
         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 3148  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 3184  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
                 for ( j = length(cand)-1, t = 0; j >= 0; j-- ) {                  for ( j = length(cand)-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,homo?ONE:0,l1,l2,l3); MKLIST(*rp,tr);                  MKLIST(l5,tl4);
           tr = mknode(7,*rp,homo?ONE:0,l1,l2,l3,l4,l5); MKLIST(*rp,tr);
     }      }
 }  }
   
Line 5346  NODE nd_f4(int m,int **indp)
Line 5383  NODE nd_f4(int m,int **indp)
 #endif  #endif
     g = 0; d = 0;      g = 0; d = 0;
     for ( i = 0; i < nd_psn; i++ ) {      for ( i = 0; i < nd_psn; i++ ) {
         d = update_pairs(d,g,i);          d = update_pairs(d,g,i,0);
         g = update_base(g,i);          g = update_base(g,i);
     }      }
     while ( d ) {      while ( d ) {
Line 5390  NODE nd_f4(int m,int **indp)
Line 5427  NODE nd_f4(int m,int **indp)
                 nf = ndtondv(m,nf1);                  nf = ndtondv(m,nf1);
             }              }
             nh = ndv_newps(m,nf,0);              nh = ndv_newps(m,nf,0);
             d = update_pairs(d,g,nh);              d = update_pairs(d,g,nh,0);
             g = update_base(g,nh);              g = update_base(g,nh);
         }          }
     }      }
Line 5424  NODE nd_f4_trace(int m,int **indp)
Line 5461  NODE nd_f4_trace(int m,int **indp)
   
     g = 0; d = 0;      g = 0; d = 0;
     for ( i = 0; i < nd_psn; i++ ) {      for ( i = 0; i < nd_psn; i++ ) {
         d = update_pairs(d,g,i);          d = update_pairs(d,g,i,0);
         g = update_base(g,i);          g = update_base(g,i);
     }      }
     while ( d ) {      while ( d ) {
Line 5490  NODE nd_f4_trace(int m,int **indp)
Line 5527  NODE nd_f4_trace(int m,int **indp)
             ndv_mod(m,nfv);              ndv_mod(m,nfv);
             ndv_removecont(m,nfv);              ndv_removecont(m,nfv);
             nh = ndv_newps(0,nfv,nfqv);              nh = ndv_newps(0,nfv,nfqv);
             d = update_pairs(d,g,nh);              d = update_pairs(d,g,nh,0);
             g = update_base(g,nh);              g = update_base(g,nh);
         }          }
     }      }

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

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