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

Diff for /OpenXM_contrib2/asir2000/builtin/array.c between version 1.18 and 1.23

version 1.18, 2001/09/17 01:18:34 version 1.23, 2001/10/01 01:58:01
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/array.c,v 1.17 2001/09/10 05:55:13 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/array.c,v 1.22 2001/09/17 08:37:30 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 74  int gauss_elim_mod1(int **,int,int,int);
Line 74  int gauss_elim_mod1(int **,int,int,int);
 int gauss_elim_geninv_mod(unsigned int **,int,int,int);  int gauss_elim_geninv_mod(unsigned int **,int,int,int);
 int gauss_elim_geninv_mod_swap(unsigned int **,int,int,unsigned int,unsigned int ***,int **);  int gauss_elim_geninv_mod_swap(unsigned int **,int,int,unsigned int,unsigned int ***,int **);
 void Pnewvect(), Pnewmat(), Psepvect(), Psize(), Pdet(), Pleqm(), Pleqm1(), Pgeninvm();  void Pnewvect(), Pnewmat(), Psepvect(), Psize(), Pdet(), Pleqm(), Pleqm1(), Pgeninvm();
   void Pinvmat();
 void Pnewbytearray();  void Pnewbytearray();
   
 void Pgeneric_gauss_elim_mod();  void Pgeneric_gauss_elim_mod();
Line 110  struct ftab array_tab[] = {
Line 111  struct ftab array_tab[] = {
         {"vtol",Pvtol,1},          {"vtol",Pvtol,1},
         {"size",Psize,1},          {"size",Psize,1},
         {"det",Pdet,-2},          {"det",Pdet,-2},
           {"invmat",Pinvmat,-2},
         {"leqm",Pleqm,2},          {"leqm",Pleqm,2},
         {"leqm1",Pleqm1,2},          {"leqm1",Pleqm1,2},
         {"geninvm",Pgeninvm,2},          {"geninvm",Pgeninvm,2},
Line 641  P *rp;
Line 643  P *rp;
         }          }
 }  }
   
   void Pinvmat(arg,rp)
   NODE arg;
   LIST *rp;
   {
           MAT m,r;
           int n,i,j,mod;
           P dn;
           P **mat,**imat,**w;
           NODE nd;
   
           m = (MAT)ARG0(arg);
           asir_assert(m,O_MAT,"invmat");
           if ( m->row != m->col )
                   error("invmat : non-square matrix");
           else if ( argc(arg) == 1 ) {
                   n = m->row;
                   invmatp(CO,(P **)BDY(m),n,&imat,&dn);
                   NEWMAT(r); r->row = n; r->col = n; r->body = (pointer **)imat;
                   nd = mknode(2,r,dn);
                   MKLIST(*rp,nd);
           } else {
                   n = m->row; mod = QTOS((Q)ARG1(arg)); mat = (P **)BDY(m);
                   w = (P **)almat_pointer(n,n);
                   for ( i = 0; i < n; i++ )
                           for ( j = 0; j < n; j++ )
                                   ptomp(mod,mat[i][j],&w[i][j]);
   #if 0
                   detmp(CO,mod,w,n,&d);
                   mptop(d,rp);
   #else
                   error("not implemented yet");
   #endif
           }
   }
   
 /*  /*
         input : a row x col matrix A          input : a row x col matrix A
                 A[I] <-> A[I][0]*x_0+A[I][1]*x_1+...                  A[I] <-> A[I][0]*x_0+A[I][1]*x_1+...
Line 1399  int md;
Line 1436  int md;
 }  }
   
 /*  /*
         rlist : reducers list  
         ht(BDY(rlist)) < ht(BDY(NEXT(rlist)) < ...  w.r.t. the term order  
 */  
   
 void reduce_reducers_mod_compress(rlist,nred,at,col,md,redmatp,indredp)  
 NODE rlist;  
 int nred;  
 DL *at;  
 int col,md;  
 CDP **redmatp;  
 int **indredp;  
 {  
         CDP *redmat;  
         CDP t;  
         int *indred,*w;  
         int i,k;  
         NODE r;  
   
         *redmatp = redmat = (CDP *)CALLOC(nred,sizeof(CDP));  
         *indredp = indred = (int *)CALLOC(nred,sizeof(int));  
         w = (int *)CALLOC(col,sizeof(int));  
   
         _dpmod_to_vect_compress(BDY(rlist),at,&redmat[0]);  
         indred[0] = redmat[0]->body[0].index;  
   
         for ( i = 1, r = NEXT(rlist); i < nred; i++, r = NEXT(r) ) {  
                 bzero(w,col*sizeof(int));  
                 _dpmod_to_vect(BDY(r),at,w);  
                 reduce_sp_by_red_mod_compress(w,redmat,indred,i,col,md);  
                 compress_vect(w,col,&redmat[i]);  
                 indred[i] = redmat[i]->body[0].index;  
         }  
 }  
   
 /*  
         mat[i] : compressed reducers (i=0,...,nred-1)          mat[i] : compressed reducers (i=0,...,nred-1)
         mat[0] < mat[1] < ... < mat[nred-1] w.r.t the term order          mat[0] < mat[1] < ... < mat[nred-1] w.r.t the term order
 */  */
   
 #define DMA0(a1,a2,a3,u,l)\  int red_by_compress(m,p,r,ri,hc,len)
 asm volatile("movl  %2,%%eax; mull  %3; addl    %4,%%eax; adcl  $0,%%edx; movl    %%edx,%0; movl %%eax,%1" :"=g"(u), "=g"(l) :"g"(a1),"g"(a2),"g"(a3) :"ax","dx");  
   
 int red_by_compress(m,p,r,hc,len)  
 int m;  int m;
 unsigned int *p;  unsigned int *p;
 struct oCM *r;  register unsigned int *r;
   register unsigned int *ri;
 unsigned int hc;  unsigned int hc;
 int len;  register int len;
 {  {
         int k;          unsigned int up,lo;
         register unsigned int up,lo;  
         unsigned int dmy;          unsigned int dmy;
         unsigned int *pj;          unsigned int *pj;
   
         p[r->index] = 0; r++;          p[*ri] = 0; r++; ri++;
         for ( k = 1; k < len; k++, r++ ) {          for ( len--; len; len--, r++, ri++ ) {
                 pj = p+r->index;                  pj = p+ *ri;
                 DMA0(r->c,hc,*pj,up,lo);                  DMA(*r,hc,*pj,up,lo);
                 if ( up ) {                  if ( up ) {
                         DSAB(m,up,lo,dmy,*pj);                          DSAB(m,up,lo,dmy,*pj);
                 } else                  } else
Line 1478  int len;
Line 1477  int len;
         *p++ = 0; r++; len--;          *p++ = 0; r++; len--;
         for ( ; len; len--, r++, p++ )          for ( ; len; len--, r++, p++ )
                 if ( *r ) {                  if ( *r ) {
                         DMA0(*r,hc,*p,up,lo);                          DMA(*r,hc,*p,up,lo);
                         if ( up ) {                          if ( up ) {
                                 DSAB(m,up,lo,dmy,*p);                                  DSAB(m,up,lo,dmy,*p);
                         } else                          } else
Line 1486  int len;
Line 1485  int len;
                 }                  }
 }  }
   
   extern unsigned int **psca;
   
 void reduce_sp_by_red_mod_compress (sp,redmat,ind,nred,col,md)  void reduce_sp_by_red_mod_compress (sp,redmat,ind,nred,col,md)
 int *sp;  int *sp;
 CDP *redmat;  CDP *redmat;
Line 1498  int md;
Line 1499  int md;
         CDP ri;          CDP ri;
         unsigned int hc,up,lo,up1,lo1,c;          unsigned int hc,up,lo,up1,lo1,c;
         unsigned int *usp;          unsigned int *usp;
         struct oCM *rib;  
   
         usp = (unsigned int *)sp;          usp = (unsigned int *)sp;
         /* reduce the spolys by redmat */          /* reduce the spolys by redmat */
Line 1510  int md;
Line 1510  int md;
                         hc = md-hc;                          hc = md-hc;
                         ri = redmat[i];                          ri = redmat[i];
                         len = ri->len;                          len = ri->len;
                         red_by_compress(md,usp,ri->body,hc,len);                          red_by_compress(md,usp,psca[ri->psindex],ri->body,hc,len);
                 }                  }
         }          }
         for ( i = 0; i < col; i++ )          for ( i = 0; i < col; i++ )

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.23

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