[BACK]Return to gr.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Diff for /OpenXM_contrib2/asir2000/builtin/gr.c between version 1.54 and 1.59

version 1.54, 2003/10/08 09:09:04 version 1.59, 2005/02/17 06:27:35
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.53 2003/07/18 10:13:12 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/gr.c,v 1.58 2004/04/22 09:45:24 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 298  void pdl(NODE f)
Line 298  void pdl(NODE f)
 void dp_gr_main(LIST f,LIST v,Num homo,int modular,int field,struct order_spec *ord,LIST *rp)  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int field,struct order_spec *ord,LIST *rp)
 {  {
         int i,mindex,m,nochk;          int i,mindex,m,nochk;
         struct order_spec ord1;          struct order_spec *ord1;
         Q q;          Q q;
         VL fv,vv,vc;          VL fv,vv,vc;
         NODE fd,fd0,fi,fi0,r,r0,t,subst,x,s,xx;          NODE fd,fd0,fi,fi0,r,r0,t,subst,x,s,xx;
         NODE ind,ind0;          NODE ind,ind0;
         LIST trace,gbindex;          LIST trace,gbindex;
           int input_is_dp = 0;
   
         mindex = 0; nochk = 0; dp_fcoeffs = field;          mindex = 0; nochk = 0; dp_fcoeffs = field;
         get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);          get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);
Line 316  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 317  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
                 homogenize_order(ord,NVars,&ord1);                  homogenize_order(ord,NVars,&ord1);
                 for ( fd0 = fi0 = 0, t = BDY(f); t; t = NEXT(t) ) {                  for ( fd0 = fi0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                         NEXTNODE(fd0,fd); NEXTNODE(fi0,fi);                          NEXTNODE(fd0,fd); NEXTNODE(fi0,fi);
                         ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fi)); dp_homo((DP)BDY(fi),(DP *)&BDY(fd));                          if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                                   dp_sort((DP)BDY(t),(DP *)&BDY(fi)); input_is_dp = 1;
                           } else
                                   ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fi));
                           dp_homo((DP)BDY(fi),(DP *)&BDY(fd));
                 }                  }
                 if ( fd0 ) NEXT(fd) = 0;                  if ( fd0 ) NEXT(fd) = 0;
                 if ( fi0 ) NEXT(fi) = 0;                  if ( fi0 ) NEXT(fi) = 0;
                 initd(&ord1);                  initd(ord1);
         } else {          } else {
                 for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {                  for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                         NEXTNODE(fd0,fd); ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd));                          NEXTNODE(fd0,fd);
                           if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                                   dp_sort((DP)BDY(t),(DP *)&BDY(fd)); input_is_dp = 1;
                           } else
                                   ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd));
                 }                  }
                 if ( fd0 ) NEXT(fd) = 0;                  if ( fd0 ) NEXT(fd) = 0;
                 fi0 = fd0;                  fi0 = fd0;
Line 340  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 349  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
         init_stat();          init_stat();
         while ( 1 ) {          while ( 1 ) {
                 if ( homo ) {                  if ( homo ) {
                         initd(&ord1); CNVars = NVars+1;                          initd(ord1); CNVars = NVars+1;
                 }                  }
                 if ( DP_Print && modular ) {                  if ( DP_Print && modular ) {
                         fprintf(asir_out,"mod= %d, eval = ",m); printsubst(subst);                          fprintf(asir_out,"mod= %d, eval = ",m); printsubst(subst);
Line 371  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 380  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
         }          }
         for ( r0 = 0, ind0 = 0; x; x = NEXT(x) ) {          for ( r0 = 0, ind0 = 0; x; x = NEXT(x) ) {
                 NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]);                  NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]);
                 dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));                  if ( input_is_dp )
                           BDY(r) = (pointer)ps[(int)BDY(x)];
                   else
                           dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));
                 NEXTNODE(ind0,ind);                  NEXTNODE(ind0,ind);
                 STOQ((int)BDY(x),q); BDY(ind) = q;                  STOQ((int)BDY(x),q); BDY(ind) = q;
         }          }
Line 397  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
Line 409  void dp_gr_main(LIST f,LIST v,Num homo,int modular,int
   
 void dp_gr_mod_main(LIST f,LIST v,Num homo,int m,struct order_spec *ord,LIST *rp)  void dp_gr_mod_main(LIST f,LIST v,Num homo,int m,struct order_spec *ord,LIST *rp)
 {  {
         struct order_spec ord1;          struct order_spec *ord1;
         VL fv,vv,vc;          VL fv,vv,vc;
         NODE fd,fd0,r,r0,t,x,s,xx;          NODE fd,fd0,r,r0,t,x,s,xx;
         DP a,b,c;          DP a,b,c;
 extern struct oEGT eg_red_mod;          extern struct oEGT eg_red_mod;
           int input_is_dp = 0;
   
         get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);          get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);
         NVars = length((NODE)vv); PCoeffs = vc ? 1 : 0; VC = vc;          NVars = length((NODE)vv); PCoeffs = vc ? 1 : 0; VC = vc;
Line 411  extern struct oEGT eg_red_mod;
Line 424  extern struct oEGT eg_red_mod;
         initd(ord);          initd(ord);
         if ( homo ) {          if ( homo ) {
                 for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {                  for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                         ptod(CO,vv,(P)BDY(t),&a); dp_homo(a,&b);                          if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                                   dp_sort((DP)BDY(t),&a); input_is_dp = 1;
                           } else
                                   ptod(CO,vv,(P)BDY(t),&a);
                           dp_homo(a,&b);
                         if ( PCoeffs )                          if ( PCoeffs )
                                 dp_mod(b,m,0,&c);                                  dp_mod(b,m,0,&c);
                         else                          else
Line 420  extern struct oEGT eg_red_mod;
Line 437  extern struct oEGT eg_red_mod;
                                 NEXTNODE(fd0,fd); BDY(fd) = (pointer)c;                                  NEXTNODE(fd0,fd); BDY(fd) = (pointer)c;
                         }                          }
                 }                  }
                 homogenize_order(ord,NVars,&ord1); initd(&ord1);                  homogenize_order(ord,NVars,&ord1); initd(ord1);
         } else {          } else {
                 for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {                  for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {
                         ptod(CO,vv,(P)BDY(t),&b);                          if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                                   dp_sort((DP)BDY(t),&b); input_is_dp = 1;
                           } else
                                   ptod(CO,vv,(P)BDY(t),&b);
                         if ( PCoeffs )                          if ( PCoeffs )
                                 dp_mod(b,m,0,&c);                                  dp_mod(b,m,0,&c);
                         else                          else
Line 437  extern struct oEGT eg_red_mod;
Line 457  extern struct oEGT eg_red_mod;
         setup_arrays(fd0,m,&s);          setup_arrays(fd0,m,&s);
         init_stat();          init_stat();
         if ( homo ) {          if ( homo ) {
                 initd(&ord1); CNVars = NVars+1;                  initd(ord1); CNVars = NVars+1;
         }          }
 /* init_eg(&eg_red_mod); */  /* init_eg(&eg_red_mod); */
         x = gb_mod(s,m);          x = gb_mod(s,m);
Line 449  extern struct oEGT eg_red_mod;
Line 469  extern struct oEGT eg_red_mod;
         reduceall_mod(x,m,&xx); x = xx;          reduceall_mod(x,m,&xx); x = xx;
         if ( PCoeffs )          if ( PCoeffs )
                 for ( r0 = 0; x; x = NEXT(x) ) {                  for ( r0 = 0; x; x = NEXT(x) ) {
                         NEXTNODE(r0,r); mdtop(CO,m,vv,ps[(int)BDY(x)],(P *)&BDY(r));                          NEXTNODE(r0,r);
                           if ( input_is_dp )
                                   mdtodp(ps[(int)BDY(x)],(DP *)&BDY(r));
                           else
                                   mdtop(CO,m,vv,ps[(int)BDY(x)],(P *)&BDY(r));
                 }                  }
         else          else
                 for ( r0 = 0; x; x = NEXT(x) ) {                  for ( r0 = 0; x; x = NEXT(x) ) {
                         NEXTNODE(r0,r); _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));                          NEXTNODE(r0,r);
                           if ( input_is_dp )
                                   _mdtodp(ps[(int)BDY(x)],(DP *)&BDY(r));
                           else
                                   _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));
                 }                  }
         print_stat();          print_stat();
         if ( r0 ) NEXT(r) = 0;          if ( r0 ) NEXT(r) = 0;
Line 465  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
Line 493  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
         int homogen;          int homogen;
         VL fv,vv,vc;          VL fv,vv,vc;
         NODE fd,fd0,r,r0,t,x,s,xx;          NODE fd,fd0,r,r0,t,x,s,xx;
           int input_is_dp = 0;
   
         dp_fcoeffs = 0;          dp_fcoeffs = 0;
         get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);          get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);
Line 474  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
Line 503  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
                 error("dp_f4_main : invalid order specification");                  error("dp_f4_main : invalid order specification");
         initd(ord);          initd(ord);
         for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) {          for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) {
                 NEXTNODE(fd0,fd); ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd));                  NEXTNODE(fd0,fd);
                   if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                           dp_sort((DP)BDY(t),(DP *)&BDY(fd)); input_is_dp = 1;
                   } else
                           ptod(CO,vv,(P)BDY(t),(DP *)&BDY(fd));
                 if ( homogen )                  if ( homogen )
                         homogen = dp_homogeneous(BDY(fd));                          homogen = dp_homogeneous(BDY(fd));
         }          }
Line 486  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
Line 519  void dp_f4_main(LIST f,LIST v,struct order_spec *ord,L
         }          }
         for ( r0 = 0; x; x = NEXT(x) ) {          for ( r0 = 0; x; x = NEXT(x) ) {
                 NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]);                  NEXTNODE(r0,r); dp_load((int)BDY(x),&ps[(int)BDY(x)]);
                 dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));                  if ( input_is_dp )
                           BDY(r) = (pointer)ps[(int)BDY(x)];
                   else
                           dtop(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));
         }          }
         if ( r0 ) NEXT(r) = 0;          if ( r0 ) NEXT(r) = 0;
         MKLIST(*rp,r0);          MKLIST(*rp,r0);
Line 498  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
Line 534  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
         VL fv,vv,vc;          VL fv,vv,vc;
         DP b,c,c1;          DP b,c,c1;
         NODE fd,fd0,r,r0,t,x,s,xx;          NODE fd,fd0,r,r0,t,x,s,xx;
           int input_is_dp = 0;
   
         dp_fcoeffs = 0;          dp_fcoeffs = 0;
         get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);          get_vars((Obj)f,&fv); pltovl(v,&vv); vlminus(fv,vv,&vc);
Line 507  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
Line 544  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
                 error("dp_f4_mod_main : invalid order specification");                  error("dp_f4_mod_main : invalid order specification");
         initd(ord);          initd(ord);
         for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) {          for ( fd0 = 0, t = BDY(f), homogen = 1; t; t = NEXT(t) ) {
                 ptod(CO,vv,(P)BDY(t),&b);                  if ( BDY(t) && OID(BDY(t)) == O_DP ) {
                           dp_sort((DP)BDY(t),&b); input_is_dp = 1;
                   } else
                           ptod(CO,vv,(P)BDY(t),&b);
                 if ( homogen )                  if ( homogen )
                         homogen = dp_homogeneous(b);                          homogen = dp_homogeneous(b);
                 _dp_mod(b,m,0,&c);                  _dp_mod(b,m,0,&c);
Line 527  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
Line 567  void dp_f4_mod_main(LIST f,LIST v,int m,struct order_s
                 reduceall_mod(x,m,&xx); x = xx;                  reduceall_mod(x,m,&xx); x = xx;
         }          }
         for ( r0 = 0; x; x = NEXT(x) ) {          for ( r0 = 0; x; x = NEXT(x) ) {
                 NEXTNODE(r0,r); _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));                  NEXTNODE(r0,r);
                   if ( input_is_dp )
                           _mdtodp(ps[(int)BDY(x)],(DP *)&BDY(r));
                   else
                           _dtop_mod(CO,vv,ps[(int)BDY(x)],(P *)&BDY(r));
         }          }
         if ( r0 ) NEXT(r) = 0;          if ( r0 ) NEXT(r) = 0;
         MKLIST(*rp,r0);          MKLIST(*rp,r0);
Line 1095  void pltovl(LIST l,VL *vl)
Line 1139  void pltovl(LIST l,VL *vl)
         *vl = r0;          *vl = r0;
 }  }
   
   void vltopl(VL vl,LIST *l)
   {
           VL n;
           NODE r,r0;
           P p;
   
           n = vl;
           for ( r0 = 0; n; n = NEXT(n) ) {
                   NEXTNODE(r0,r); MKV(n->v,p); BDY(r) = (pointer)p;
           }
           if ( r0 ) NEXT(r) = 0;
           MKLIST(*l,r0);
   }
   
 void makesubst(VL v,NODE *s)  void makesubst(VL v,NODE *s)
 {  {
         NODE r,r0;          NODE r,r0;
Line 1325  void reduceall(NODE in,NODE *h)
Line 1383  void reduceall(NODE in,NODE *h)
         w = (int *)ALLOCA(n*sizeof(int));          w = (int *)ALLOCA(n*sizeof(int));
         for ( i = 0, t = r; i < n; i++, t = NEXT(t) )          for ( i = 0, t = r; i < n; i++, t = NEXT(t) )
                 w[i] = (int)BDY(t);                  w[i] = (int)BDY(t);
           /* w[i] < 0 : reduced to 0 */
         for ( i = 0; i < n; i++ ) {          for ( i = 0; i < n; i++ ) {
                 for ( top = 0, j = n-1; j >= 0; j-- )                  for ( top = 0, j = n-1; j >= 0; j-- )
                         if ( j != i ) {                          if ( w[j] >= 0 && j != i ) {
                                 MKNODE(t,(pointer)w[j],top); top = t;                                  MKNODE(t,(pointer)w[j],top); top = t;
                         }                          }
                 get_eg(&tmp0);                  get_eg(&tmp0);
Line 1349  void reduceall(NODE in,NODE *h)
Line 1408  void reduceall(NODE in,NODE *h)
                 if ( DP_Print || DP_PrintShort ) {                  if ( DP_Print || DP_PrintShort ) {
                         fprintf(asir_out,"."); fflush(asir_out);                          fprintf(asir_out,"."); fflush(asir_out);
                 }                  }
                 w[i] = newps(g1,0,(NODE)0);                  if ( g1 ) {
                           w[i] = newps(g1,0,(NODE)0);
                   } else {
                           w[i] = -1;
                   }
         }          }
         for ( top = 0, j = n-1; j >= 0; j-- ) {          for ( top = 0, j = n-1; j >= 0; j-- ) {
                 MKNODE(t,(pointer)w[j],top); top = t;                  if ( w[j] >= 0 ) {
                           MKNODE(t,(pointer)w[j],top); top = t;
                   }
         }          }
         *h = top;          *h = top;
         if ( DP_Print || DP_PrintShort )          if ( DP_Print || DP_PrintShort )
Line 1378  void reduceall_mod(NODE in,int m,NODE *h)
Line 1443  void reduceall_mod(NODE in,int m,NODE *h)
         w = (int *)ALLOCA(n*sizeof(int));          w = (int *)ALLOCA(n*sizeof(int));
         for ( i = 0, t = r; i < n; i++, t = NEXT(t) )          for ( i = 0, t = r; i < n; i++, t = NEXT(t) )
                 w[i] = (int)BDY(t);                  w[i] = (int)BDY(t);
           /* w[i] < 0 : reduced to 0 */
         for ( i = 0; i < n; i++ ) {          for ( i = 0; i < n; i++ ) {
                 for ( top = 0, j = n-1; j >= 0; j-- )                  for ( top = 0, j = n-1; j >= 0; j-- )
                         if ( j != i ) {                          if ( w[j] >= 0 && j != i ) {
                                 MKNODE(t,(pointer)w[j],top); top = t;                                  MKNODE(t,(pointer)w[j],top); top = t;
                         }                          }
                 get_eg(&tmp0);                  get_eg(&tmp0);
Line 1394  void reduceall_mod(NODE in,int m,NODE *h)
Line 1460  void reduceall_mod(NODE in,int m,NODE *h)
                 if ( DP_Print || DP_PrintShort ) {                  if ( DP_Print || DP_PrintShort ) {
                         fprintf(asir_out,"."); fflush(asir_out);                          fprintf(asir_out,"."); fflush(asir_out);
                 }                  }
                 w[i] = newps_mod(g,m);                  if ( g ) {
                           w[i] = newps_mod(g,m);
                   } else {
                           w[i] = -1;
                   }
         }          }
         for ( top = 0, j = n-1; j >= 0; j-- ) {          for ( top = 0, j = n-1; j >= 0; j-- ) {
                 MKNODE(t,(pointer)w[j],top); top = t;                  if ( w[j] >= 0 ) {
                           MKNODE(t,(pointer)w[j],top); top = t;
                   }
         }          }
         *h = top;          *h = top;
         if ( DP_Print || DP_PrintShort )          if ( DP_Print || DP_PrintShort )

Legend:
Removed from v.1.54  
changed lines
  Added in v.1.59

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