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

Diff for /OpenXM_contrib2/asir2000/builtin/dp.c between version 1.93 and 1.94

version 1.93, 2014/10/10 09:02:24 version 1.94, 2015/01/13 00:54:54
Line 44 
Line 44 
  * 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/dp.c,v 1.92 2014/08/19 06:35:01 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp.c,v 1.93 2014/10/10 09:02:24 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 56  extern int dp_order_pair_length;
Line 56  extern int dp_order_pair_length;
 extern struct order_pair *dp_order_pair;  extern struct order_pair *dp_order_pair;
 extern struct order_spec *dp_current_spec;  extern struct order_spec *dp_current_spec;
 extern struct modorder_spec *dp_current_modspec;  extern struct modorder_spec *dp_current_modspec;
   extern int nd_rref2;
   
 int do_weyl;  int do_weyl;
   
Line 109  void Pdp_get_denomlist();
Line 110  void Pdp_get_denomlist();
 void Pdp_symb_add();  void Pdp_symb_add();
 void Pdp_mono_raddec();  void Pdp_mono_raddec();
 void Pdp_mono_reduce();  void Pdp_mono_reduce();
   void Pdp_rref2();
   
 LIST dp_initial_term();  LIST dp_initial_term();
 LIST dp_order();  LIST dp_order();
Line 275  struct ftab dp_supp_tab[] = {
Line 277  struct ftab dp_supp_tab[] = {
         {"dp_mono_raddec",Pdp_mono_raddec,2},          {"dp_mono_raddec",Pdp_mono_raddec,2},
         {"dp_mono_reduce",Pdp_mono_reduce,2},          {"dp_mono_reduce",Pdp_mono_reduce,2},
   
           {"dp_rref2",Pdp_rref2,2},
   
         {0,0,0}          {0,0,0}
 };  };
   
Line 1282  DP *rp;
Line 1286  DP *rp;
         p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);          p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);
         asir_assert(p1,O_DP,"dp_symb_add");          asir_assert(p1,O_DP,"dp_symb_add");
         asir_assert(p2,O_DP,"dp_symb_add");          asir_assert(p2,O_DP,"dp_symb_add");
           if ( !p1 ) { *rp = p2; return; }
           else if ( !p2 ) { *rp = p1; return; }
         if ( p1->nv != p2->nv )          if ( p1->nv != p2->nv )
                 error("dp_sumb_add : invalid input");                  error("dp_sumb_add : invalid input");
         nv = p1->nv;          nv = p1->nv;
Line 2144  LIST *rp;
Line 2150  LIST *rp;
         struct order_spec *ord;          struct order_spec *ord;
   
         do_weyl = 0;          do_weyl = 0;
           nd_rref2 = 0;
         asir_assert(ARG0(arg),O_LIST,"nd_f4");          asir_assert(ARG0(arg),O_LIST,"nd_f4");
         asir_assert(ARG1(arg),O_LIST,"nd_f4");          asir_assert(ARG1(arg),O_LIST,"nd_f4");
         asir_assert(ARG2(arg),O_N,"nd_f4");          asir_assert(ARG2(arg),O_N,"nd_f4");
Line 2157  LIST *rp;
Line 2164  LIST *rp;
         homo = retdp = 0;          homo = retdp = 0;
         if ( get_opt("homo",&val) && val ) homo = 1;          if ( get_opt("homo",&val) && val ) homo = 1;
         if ( get_opt("dp",&val) && val ) retdp = 1;          if ( get_opt("dp",&val) && val ) retdp = 1;
           if ( get_opt("rref2",&val) && val ) nd_rref2 = 1;
         nd_gr(f,v,m,homo,retdp,1,ord,rp);          nd_gr(f,v,m,homo,retdp,1,ord,rp);
 }  }
   
Line 2791  void Pdp_mono_reduce(NODE arg,LIST *rp)
Line 2799  void Pdp_mono_reduce(NODE arg,LIST *rp)
                 if ( a[i] ) { NEXTNODE(r0,r); BDY(r) = a[i]; }                  if ( a[i] ) { NEXTNODE(r0,r); BDY(r) = a[i]; }
         if ( r0 ) NEXT(r) = 0;          if ( r0 ) NEXT(r) = 0;
         MKLIST(*rp,r0);          MKLIST(*rp,r0);
   }
   
   #define BLEN (8*sizeof(unsigned long))
   
   void showmat2(unsigned long **a,int row,int col)
   {
     int i,j;
   
     for ( i = 0; i < row; i++, putchar('\n') )
       for ( j = 0; j < col; j++ )
               if ( a[i][j/BLEN] & (1L<<(j%BLEN)) ) putchar('1');
         else putchar('0');
   }
   
   int rref2(unsigned long **a,int row,int col)
   {
     int i,j,k,l,s,wcol,wj;
     unsigned long bj;
     unsigned long *ai,*ak,*as,*t;
     int *pivot;
   
     wcol = (col+BLEN-1)/BLEN;
     pivot = (int *)MALLOC_ATOMIC(row*sizeof(int));
     i = 0;
     for ( j = 0; j < col; j++ ) {
             wj = j/BLEN; bj = 1L<<(j%BLEN);
       for ( k = i; k < row; k++ )
             if ( a[k][wj] & bj ) break;
       if ( k == row ) continue;
       pivot[i] = j;
       if ( k != i ) {
        t = a[i]; a[i] = a[k]; a[k] = t;
             }
             ai = a[i];
       for ( k = i+1; k < row; k++ ) {
               ak = a[k];
               if ( ak[wj] & bj ) {
                 for ( l = wj; l < wcol; l++ )
                         ak[l] ^= ai[l];
               }
             }
           i++;
     }
     for ( k = i-1; k >= 0; k-- ) {
       j = pivot[k]; wj = j/BLEN; bj = 1L<<(j%BLEN);
             ak = a[k];
       for ( s = 0; s < k; s++ ) {
               as = a[s];
         if ( as[wj] & bj ) {
           for ( l = wj; l < wcol; l++ )
                         as[l] ^= ak[l];
               }
             }
     }
     return i;
   }
   
   void Pdp_rref2(NODE arg,VECT *rp)
   {
     VECT f,term,ret;
     int row,col,wcol,size,nv,i,j,rank,td;
     unsigned long **mat;
     unsigned long *v;
     DL d;
     DL *t;
     DP dp;
     MP m,m0;
   
     f = (VECT)ARG0(arg);
     row = f->len;
     term = (VECT)ARG1(arg);
     col = term->len;
     mat = (unsigned long **)MALLOC(row*sizeof(unsigned long *));
     size = sizeof(unsigned long)*((col+BLEN-1)/BLEN);
     nv = ((DP)term->body[0])->nv;
     t = (DL *)MALLOC(col*sizeof(DL));
     for ( i = 0; i < col; i++ ) t[i] = BDY((DP)BDY(term)[i])->dl;
     for ( i = 0; i < row; i++ ) {
       v = mat[i] = (unsigned long *)MALLOC_ATOMIC_IGNORE_OFF_PAGE(size);
           bzero(v,size);
           for ( j = 0, m = BDY((DP)BDY(f)[i]); m; m = NEXT(m) ) {
             d = m->dl;
             for ( ; !dl_equal(nv,d,t[j]); j++ );
             v[j/BLEN] |= 1L <<(j%BLEN);
           }
     }
     rank = rref2(mat,row,col);
     MKVECT(ret,rank);
     *rp = ret;
     for ( i = 0; i < rank; i++ ) {
       v = mat[i];
           m0 = 0;
           td = 0;
       for ( j = 0; j < col; j++ ) {
             if ( v[j/BLEN] & (1L<<(j%BLEN)) ) {
               NEXTMP(m0,m);
                   m->dl = t[j];
                   m->c = (P)ONE;
               td = MAX(td,m->dl->td);
             }
           }
           NEXT(m) = 0;
           MKDP(nv,m0,dp);
           dp->sugar = td;
       BDY(ret)[i] = (pointer)dp;
     }
 }  }
   
 LIST remove_zero_from_list(LIST l)  LIST remove_zero_from_list(LIST l)

Legend:
Removed from v.1.93  
changed lines
  Added in v.1.94

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