[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.134 and 1.145

version 1.134, 2006/06/06 07:14:16 version 1.145, 2006/08/26 05:38:06
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.133 2006/06/05 08:11:10 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.144 2006/08/26 03:09:55 noro Exp $ */
   
 #include "nd.h"  #include "nd.h"
   
Line 1592  NODE nd_gb(int m,int ishomo,int checkonly)
Line 1592  NODE nd_gb(int m,int ishomo,int checkonly)
         NDV nfv;          NDV nfv;
         Q q,num,den;          Q q,num,den;
         union oNDC dn;          union oNDC dn;
           int diag_count = 0;
   
         g = 0; d = 0;          g = 0; d = 0;
         for ( i = 0; i < nd_psn; i++ ) {          for ( i = 0; i < nd_psn; i++ ) {
Line 1604  again:
Line 1605  again:
                 l = nd_minp(d,&d);                  l = nd_minp(d,&d);
                 if ( SG(l) != sugar ) {                  if ( SG(l) != sugar ) {
                         if ( ishomo ) {                          if ( ishomo ) {
                                   diag_count = 0;
                                 stat = do_diagonalize(sugar,m);                                  stat = do_diagonalize(sugar,m);
                                 if ( !stat ) {                                  if ( !stat ) {
                                         NEXT(l) = d; d = l;                                          NEXT(l) = d; d = l;
Line 1639  again:
Line 1641  again:
                         }                          }
                         nfv = ndtondv(m,nf); nd_free(nf);                          nfv = ndtondv(m,nf); nd_free(nf);
                         nh = ndv_newps(m,nfv,0);                          nh = ndv_newps(m,nfv,0);
                           if ( !m && (ishomo && ++diag_count == diag_period) ) {
                                   diag_count = 0;
                                   stat = do_diagonalize(sugar,m);
                                   if ( !stat ) {
                                           NEXT(l) = d; d = l;
                                           d = nd_reconstruct(1,d);
                                           goto again;
                                   }
                           }
                         d = update_pairs(d,g,nh);                          d = update_pairs(d,g,nh);
                         g = update_base(g,nh);                          g = update_base(g,nh);
                         FREENDP(l);                          FREENDP(l);
Line 2208  void ndv_setup(int mod,int trace,NODE f,int dont_sort)
Line 2219  void ndv_setup(int mod,int trace,NODE f,int dont_sort)
         for ( nd_psn = 0, s = f; s; s = NEXT(s) ) if ( BDY(s) ) nd_psn++;          for ( nd_psn = 0, s = f; s; s = NEXT(s) ) if ( BDY(s) ) nd_psn++;
         w = (NDV *)ALLOCA(nd_psn*sizeof(NDV));          w = (NDV *)ALLOCA(nd_psn*sizeof(NDV));
         for ( i = 0, s = f; s; s = NEXT(s) ) if ( BDY(s) ) w[i++] = BDY(s);          for ( i = 0, s = f; s; s = NEXT(s) ) if ( BDY(s) ) w[i++] = BDY(s);
         if ( !dont_sort )          if ( !dont_sort ) {
                 qsort(w,nd_psn,sizeof(NDV),                  /* XXX heuristic */
                         (int (*)(const void *,const void *))ndv_compare);                  if ( !nd_ord->id && (nd_ord->ord.simple<2) )
                           qsort(w,nd_psn,sizeof(NDV),
                                   (int (*)(const void *,const void *))ndv_compare_rev);
                   else
                           qsort(w,nd_psn,sizeof(NDV),
                                   (int (*)(const void *,const void *))ndv_compare);
           }
         nd_pslen = 2*nd_psn;          nd_pslen = 2*nd_psn;
         nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV));          nd_ps = (NDV *)MALLOC(nd_pslen*sizeof(NDV));
         nd_ps_trace = (NDV *)MALLOC(nd_pslen*sizeof(NDV));          nd_ps_trace = (NDV *)MALLOC(nd_pslen*sizeof(NDV));
Line 2359  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2376  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
         NDV b;          NDV b;
         int ishomo,nalg;          int ishomo,nalg;
         Alg alpha,dp;          Alg alpha,dp;
         P p;          P p,zp;
           Q dmy;
         LIST f1,f2;          LIST f1,f2;
         Obj obj;          Obj obj;
         NumberField nf;          NumberField nf;
Line 2405  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
Line 2423  void nd_gr(LIST f,LIST v,int m,int f4,struct order_spe
         nd_setup_parameters(nvar,max);          nd_setup_parameters(nvar,max);
         ishomo = 1;          ishomo = 1;
         for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {          for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                 b = (pointer)ptondv(CO,vv,(P)BDY(t));                  ptozp((P)BDY(t),1,&dmy,&zp);
                   b = (pointer)ptondv(CO,vv,zp);
                 if ( ishomo )                  if ( ishomo )
                         ishomo = ishomo && ndv_ishomo(b);                          ishomo = ishomo && ndv_ishomo(b);
                 if ( m ) ndv_mod(m,b);                  if ( m ) ndv_mod(m,b);
Line 2438  void nd_gr_postproc(LIST f,LIST v,int m,struct order_s
Line 2457  void nd_gr_postproc(LIST f,LIST v,int m,struct order_s
         NDV b;          NDV b;
         int ishomo,nalg;          int ishomo,nalg;
         Alg alpha,dp;          Alg alpha,dp;
         P p;          P p,zp;
           Q dmy;
         LIST f1,f2;          LIST f1,f2;
         Obj obj;          Obj obj;
         NumberField nf;          NumberField nf;
Line 2478  void nd_gr_postproc(LIST f,LIST v,int m,struct order_s
Line 2498  void nd_gr_postproc(LIST f,LIST v,int m,struct order_s
         nd_setup_parameters(nvar,max);          nd_setup_parameters(nvar,max);
         ishomo = 1;          ishomo = 1;
         for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {          for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                 b = (pointer)ptondv(CO,vv,(P)BDY(t));                  ptozp((P)BDY(t),1,&dmy,&zp);
                   b = (pointer)ptondv(CO,vv,zp);
                 if ( ishomo )                  if ( ishomo )
                         ishomo = ishomo && ndv_ishomo(b);                          ishomo = ishomo && ndv_ishomo(b);
                 if ( m ) ndv_mod(m,b);                  if ( m ) ndv_mod(m,b);
Line 2517  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 2538  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
         int m,nocheck,nvar,mindex,e,max;          int m,nocheck,nvar,mindex,e,max;
         NDV c;          NDV c;
         NMV a;          NMV a;
         P p;          P p,zp;
           Q dmy;
         EPOS oepos;          EPOS oepos;
         int obpe,oadv,wmax,i,len,cbpe,ishomo,nalg;          int obpe,oadv,wmax,i,len,cbpe,ishomo,nalg;
         Alg alpha,dp;          Alg alpha,dp;
Line 2526  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 2548  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
         Obj obj;          Obj obj;
         NumberField nf;          NumberField nf;
         struct order_spec *ord1;          struct order_spec *ord1;
           struct oEGT eg_check,eg0,eg1;
   
         get_vars((Obj)f,&fv); pltovl(v,&vv);          get_vars((Obj)f,&fv); pltovl(v,&vv);
         for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ );          for ( nvar = 0, tv = vv; tv; tv = NEXT(tv), nvar++ );
Line 2572  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 2595  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
         obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos;          obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos;
         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) ) {
                 c = ptondv(CO,vv,(P)BDY(t));                  ptozp((P)BDY(t),1,&dmy,&zp);
                   c = (pointer)ptondv(CO,vv,zp);
                 if ( ishomo )                  if ( ishomo )
                         ishomo = ishomo && ndv_ishomo(c);                          ishomo = ishomo && ndv_ishomo(c);
                 if ( c ) {                  if ( c ) {
Line 2617  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 2641  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
                 cbpe = nd_bpe;                  cbpe = nd_bpe;
                 if ( nocheck )                  if ( nocheck )
                         break;                          break;
                   get_eg(&eg0);
                 if ( ndv_check_candidate(in0,obpe,oadv,oepos,cand) )                  if ( ndv_check_candidate(in0,obpe,oadv,oepos,cand) )
                         /* success */                          /* success */
                         break;                          break;
Line 2636  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
Line 2661  void nd_gr_trace(LIST f,LIST v,int trace,int homo,int 
                         }                          }
                 }                  }
         }          }
           get_eg(&eg1); init_eg(&eg_check); add_eg(&eg_check,&eg0,&eg1);
           if ( DP_Print )
                   fprintf(asir_out,"check=%fsec\n",eg_check.exectime+eg_check.gctime);
         /* dp->p */          /* dp->p */
         nd_bpe = cbpe;          nd_bpe = cbpe;
         nd_setup_parameters(nd_nvar,0);          nd_setup_parameters(nd_nvar,0);
Line 4168  IndArray nm_ind_pair_to_vect_compress(int mod,UINT *s0
Line 4196  IndArray nm_ind_pair_to_vect_compress(int mod,UINT *s0
         return r;          return r;
 }  }
   
   int compress_array(Q *svect,Q *cvect,int n)
   {
           int i,j;
   
           for ( i = j = 0; i < n; i++ )
                   if ( svect[i] ) cvect[j++] = svect[i];
           return j;
   }
   
   void expand_array(Q *svect,Q *cvect,int n)
   {
           int i,j;
   
           for ( i = j = 0; j < n;  i++  )
                   if ( svect[i] ) svect[i] = cvect[j++];
   }
   
 int ndv_reduce_vect_q(Q *svect,int trace,int col,IndArray *imat,NM_ind_pair *rp0,int nred)  int ndv_reduce_vect_q(Q *svect,int trace,int col,IndArray *imat,NM_ind_pair *rp0,int nred)
 {  {
         int i,j,k,len,pos,prev;          int i,j,k,len,pos,prev,nz;
         Q cs,mcs,c1,c2,cr,gcd,t;          Q cs,mcs,c1,c2,cr,gcd,t;
         IndArray ivect;          IndArray ivect;
         unsigned char *ivc;          unsigned char *ivc;
Line 4181  int ndv_reduce_vect_q(Q *svect,int trace,int col,IndAr
Line 4226  int ndv_reduce_vect_q(Q *svect,int trace,int col,IndAr
         NODE rp;          NODE rp;
         int maxrs;          int maxrs;
         double hmag;          double hmag;
         struct oVECT v;          Q *cvect;
   
         v.id = O_VECT; v.len = col; v.body = (pointer *)svect;  
         maxrs = 0;          maxrs = 0;
         for ( i = 0; i < col && !svect[i]; i++ );          for ( i = 0; i < col && !svect[i]; i++ );
         if ( i == col ) return maxrs;          if ( i == col ) return maxrs;
         hmag = p_mag((P)svect[i])*nd_scale;          hmag = p_mag((P)svect[i])*nd_scale;
           cvect = (Q *)ALLOCA(col*sizeof(Q));
         for ( i = 0; i < nred; i++ ) {          for ( i = 0; i < nred; i++ ) {
                 ivect = imat[i];                  ivect = imat[i];
                 k = ivect->head;                  k = ivect->head;
Line 4229  int ndv_reduce_vect_q(Q *svect,int trace,int col,IndAr
Line 4274  int ndv_reduce_vect_q(Q *svect,int trace,int col,IndAr
                         for ( j = k+1; j < col && !svect[j]; j++ );                          for ( j = k+1; j < col && !svect[j]; j++ );
                         if ( j == col ) break;                          if ( j == col ) break;
                         if ( hmag && ((double)p_mag((P)svect[j]) > hmag) ) {                          if ( hmag && ((double)p_mag((P)svect[j]) > hmag) ) {
                                 igcdv(&v,&t);                                  nz = compress_array(svect,cvect,col);
                                   removecont_array(cvect,nz);
                                   expand_array(svect,cvect,nz);
                                 hmag = ((double)p_mag((P)svect[j]))*nd_scale;                                  hmag = ((double)p_mag((P)svect[j]))*nd_scale;
                         }                          }
                 }                  }
         }          }
         igcdv(&v,&t);          nz = compress_array(svect,cvect,col);
           removecont_array(cvect,nz);
           expand_array(svect,cvect,nz);
         if ( DP_Print ) {          if ( DP_Print ) {
                 fprintf(asir_out,"-"); fflush(asir_out);                  fprintf(asir_out,"-"); fflush(asir_out);
         }          }
Line 4813  NODE nd_f4_red_q_main(ND_pairs sp0,int nsp,int trace,U
Line 4862  NODE nd_f4_red_q_main(ND_pairs sp0,int nsp,int trace,U
         struct oEGT eg0,eg1,eg2,eg_f4,eg_f4_1,eg_f4_2;          struct oEGT eg0,eg1,eg2,eg_f4,eg_f4_1,eg_f4_2;
         int maxrs;          int maxrs;
         int *spsugar;          int *spsugar;
           pointer *w;
   
         spcol = col-nred;          spcol = col-nred;
         get_eg(&eg0);          get_eg(&eg0);
Line 4846  NODE nd_f4_red_q_main(ND_pairs sp0,int nsp,int trace,U
Line 4896  NODE nd_f4_red_q_main(ND_pairs sp0,int nsp,int trace,U
         /* elimination (2nd step) */          /* elimination (2nd step) */
         colstat = (int *)ALLOCA(spcol*sizeof(int));          colstat = (int *)ALLOCA(spcol*sizeof(int));
         rank = nd_gauss_elim_q(spmat,spsugar,sprow,spcol,colstat);          rank = nd_gauss_elim_q(spmat,spsugar,sprow,spcol,colstat);
         r0 = 0;          w = (pointer *)ALLOCA(rank*sizeof(pointer));
         for ( i = 0; i < rank; i++ ) {          for ( i = 0; i < rank; i++ ) {
                 NEXTNODE(r0,r); BDY(r) =                  w[rank-i-1] = (pointer)vect_to_ndv_q(spmat[i],spcol,col,rhead,s0vect);
                         (pointer)vect_to_ndv_q(spmat[i],spcol,col,rhead,s0vect);                  SG((NDV)w[rank-i-1]) = spsugar[i];
                 SG((NDV)BDY(r)) = spsugar[i];  
 /*              GC_free(spmat[i]); */  /*              GC_free(spmat[i]); */
           }
   #if 0
           qsort(w,rank,sizeof(NDV),
                   (int (*)(const void *,const void *))ndv_compare);
   #endif
           r0 = 0;
           for ( i = 0; i < rank; i++ ) {
                   NEXTNODE(r0,r); BDY(r) = w[i];
         }          }
         if ( r0 ) NEXT(r) = 0;          if ( r0 ) NEXT(r) = 0;
   

Legend:
Removed from v.1.134  
changed lines
  Added in v.1.145

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