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

Diff for /OpenXM_contrib2/asir2000/engine/mat.c between version 1.12 and 1.16

version 1.12, 2004/08/18 06:30:07 version 1.16, 2009/11/24 04:34:30
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/engine/mat.c,v 1.11 2004/07/26 07:15:46 saito Exp $   * $OpenXM: OpenXM_contrib2/asir2000/engine/mat.c,v 1.15 2005/12/21 23:18:16 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "../parse/parse.h"  #include "../parse/parse.h"
   
 extern int StrassenSize;  extern int StrassenSize;
   /* remove miser type
 void mulmatmat_miser();  void mulmatmat_miser();
   */
   
 void addmat(vl,a,b,c)  void addmat(vl,a,b,c)
 VL vl;  VL vl;
Line 103  MAT a,b,*c;
Line 105  MAT a,b,*c;
   }    }
 }  }
   
   /* remove miser type
 void addmat_miser(vl,a,b,c,ar0,ac0,ar1,ac1,br0,bc0,br1,bc1)  void addmat_miser(vl,a,b,c,ar0,ac0,ar1,ac1,br0,bc0,br1,bc1)
 VL vl;  VL vl;
 MAT a,b,*c;  MAT a,b,*c;
Line 197  int ar0,ac0,ar1,ac1,br0,bc0,br1,bc1;
Line 200  int ar0,ac0,ar1,ac1,br0,bc0,br1,bc1;
     *c = t;      *c = t;
   }    }
 }  }
   */
   
 void mulmat(vl,a,b,c)  void mulmat(vl,a,b,c)
 VL vl;  VL vl;
Line 242  Obj a,b,*c;
Line 246  Obj a,b,*c;
                                         case O_VECT:                                          case O_VECT:
                                                 mulmatvect(vl,(MAT)a,(VECT)b,(VECT *)c); break;                                                  mulmatvect(vl,(MAT)a,(VECT)b,(VECT *)c); break;
                                         case O_MAT:                                          case O_MAT:
                                                   mulmatmat(vl, (MAT)a, (MAT)b, (MAT *)c); break;
   /* remove miser type
                                                 mulmatmat_miser(vl,(MAT)a,(MAT)b,(MAT *)c, 0,0, ((MAT)a)->row-1, ((MAT)a)->col-1, 0,0,((MAT)b)->row-1, ((MAT)b)->col-1); break;                                                  mulmatmat_miser(vl,(MAT)a,(MAT)b,(MAT *)c, 0,0, ((MAT)a)->row-1, ((MAT)a)->col-1, 0,0,((MAT)b)->row-1, ((MAT)b)->col-1); break;
   */
                                         default:                                          default:
                                                 notdef(vl,a,b,c); break;                                                  notdef(vl,a,b,c); break;
                                 }                                  }
Line 366  void mulmatmat(vl,a,b,c)
Line 373  void mulmatmat(vl,a,b,c)
 VL vl;  VL vl;
 MAT a,b,*c;  MAT a,b,*c;
 {  {
 #if 0  
         int arow,bcol,i,j,k,m;  
         MAT t;  
         pointer s,u,v;  
         pointer *ab,*tb;  
   
         /* Mismach col and row */  
         if ( a->col != b->row ) {  
                 *c = 0; error("mulmat : size mismatch");  
         } else {  
                 arow = a->row; m = a->col; bcol = b->col;  
                 MKMAt(t,arow,bcol);  
                 for ( i = 0; i < arow; i++ )  
                         for ( j = 0, ab = BDY(a)[i], tb = BDY(t)[i]; j < bcol; j++ ) {  
                                 for ( k = 0, s = 0; k < m; k++ ) {  
                                         arf_mul(vl,(Obj)ab[k],(Obj)BDY(b)[k][j],(Obj *)&u);  
                                         arf_add(vl,(Obj)s,(Obj)u,(Obj *)&v);  
                                         s = v;  
                                 }  
                                 tb[j] = s;  
                         }  
                 *c = t;  
         }  
 }  
   
 void Strassen(arg, c)  
 NODE arg;  
 Obj *c;  
 {  
   AT a,b;  
         VL vl;  
   
         /* tomo */  
         a = (MAT)ARG0(arg);  
         b = (MAT)ARG1(arg);  
         vl = CO;  
         strassen(CO, a, b, c);  
 }  
   
 void strassen(vl,a,b,c)  
 VL vl;  
 MAT a,b,*c;  
 {  
 #endif  
         int arow,bcol,i,j,k,m, h, arowh, bcolh;          int arow,bcol,i,j,k,m, h, arowh, bcolh;
         MAT t, a11, a12, a21, a22;          MAT t, a11, a12, a21, a22;
         MAT p, b11, b12, b21, b22;          MAT p, b11, b12, b21, b22;
Line 419  MAT a,b,*c;
Line 382  MAT a,b,*c;
         pointer *ab,*tb;          pointer *ab,*tb;
         int a1row,a2row, a3row,a4row, a1col, a2col, a3col, a4col;          int a1row,a2row, a3row,a4row, a1col, a2col, a3col, a4col;
         int b1row,b2row, b3row,b4row, b1col, b2col, b3col, b4col;          int b1row,b2row, b3row,b4row, b1col, b2col, b3col, b4col;
         int pflag1, pflag2;          int pflag1, pflag2, pflag3;
         /* mismach col and row */          /* mismach col and row */
         if ( a->col != b->row ) {          if ( a->col != b->row ) {
                 *c = 0; error("mulmat : size mismatch");                  *c = 0; error("mulmat : size mismatch");
         }          }
         else {          else {
                 pflag1 = 0; pflag2 = 0;                  pflag1 = 0; pflag2 = 0; pflag3 = 0;
                 arow = a->row; m = a->col; bcol = b->col;                  arow = a->row; m = a->col; bcol = b->col;
                 MKMAT(t,arow,bcol);                  MKMAT(t,arow,bcol);
                 /* StrassenSize == 0 or matrix size less then StrassenSize,                  /* StrassenSize == 0 or matrix size less then StrassenSize,
Line 456  MAT a,b,*c;
Line 419  MAT a,b,*c;
                         m++;                          m++;
                         pflag2 = 1;                          pflag2 = 1;
                 }                  }
 /*  
                 MKMAT(aa, arow, m);  
                 for (i = 0; i < a->row; i++) {  
                         for (j = 0; j < a->col; j++) {  
                                 aa->body[i][j] = a->body[i][j];  
                         }  
                 }  
                 i = bcol/2;                  i = bcol/2;
                 j = bcol - i;                  j = bcol - i;
                 if (i != j) {                  if (i != j) {
                         bcol++;                          bcol++;
                           pflag3 = 1;
                 }                  }
                 MKMAT(bb, m, bcol);  
                 for (i = 0; i < b->row; i++) {  
                         for ( j = 0; j < b->col; j++) {  
                                 bb->body[i][j] = b->body[i][j];  
                         }  
                 }  
 */  
   
                 /* split matrix A and B */                  /* split matrix A and B */
                 a1row = arow/2; a1col = m/2;                  a1row = arow/2; a1col = m/2;
Line 545  MAT a,b,*c;
Line 496  MAT a,b,*c;
                                 b22->body[i-b1row][j-b1col] = b->body[i][j];                                  b22->body[i-b1row][j-b1col] = b->body[i][j];
                         }                          }
                 }                  }
   
                   /* extension by zero */
                   if (pflag1) {
                           for (j = 0; j < a1col; j++) {
                                   a21->body[a1row-1][j] = 0; /* null */
                           }
                           for (j = a1col; j < a->col; j++) {
                                   a22->body[a1row-1][j-a1col] = 0;
                           }
                   }
                   if (pflag2) {
                           for (i = 0; i < a1row; i++) {
                                   a12->body[i][a1col-1] = 0;
                           }
                           for (i = a1row; i < a->row; i++) {
                                   a22->body[i-a1row][a1col-1] = 0;
                           }
                           for (j = 0; j < b1col; j++) {
                                   b21->body[b1row-1][j] = 0;
                           }
                           for (j = b1col; j < b->col; j++) {
                                   b22->body[b1row-1][j-b1col] = 0;
                           }
                   }
                   if (pflag3) {
                           for (i = 0; i < b1row; i++) {
                                   b12->body[i][b1col-1] = 0;
                           }
                           for (i = b1row; i < b->row; i++) {
                                   b22->body[i-b1row][b1col-1] = 0;
                           }
                   }
   
                 /* expand matrix by Strassen-Winograd algorithm */                  /* expand matrix by Strassen-Winograd algorithm */
                 /* s1=A21+A22 */                  /* s1=A21+A22 */
                 addmat(vl,a21,a22,&s1);                  addmat(vl,a21,a22,&s1);
Line 634  MAT a,b,*c;
Line 618  MAT a,b,*c;
         *c = t;          *c = t;
 }  }
   
   #if 0
   /* remove miser type */
 void mulmatmat_miser(vl,a,b,c,ar0,ac0,ar1,ac1,br0,bc0,br1,bc1)  void mulmatmat_miser(vl,a,b,c,ar0,ac0,ar1,ac1,br0,bc0,br1,bc1)
 VL vl;  VL vl;
 MAT a,b,*c;  MAT a,b,*c;
Line 806  int ar0, ac0, ar1, ac1, br0, bc0, br1, bc1;
Line 792  int ar0, ac0, ar1, ac1, br0, bc0, br1, bc1;
         }          }
         *c = t;          *c = t;
 }  }
   #endif
   
 void mulmatvect(vl,a,b,c)  void mulmatvect(vl,a,b,c)
 VL vl;  VL vl;
Line 823  VECT *c;
Line 810  VECT *c;
         else if ( a->col != b->len ) {          else if ( a->col != b->len ) {
                 *c = 0; error("mulmatvect : size mismatch");                  *c = 0; error("mulmatvect : size mismatch");
         } else {          } else {
   #if 0
                 for ( i = 0; i < b->len; i++ )                  for ( i = 0; i < b->len; i++ )
                         if ( BDY(b)[i] && OID((Obj)BDY(b)[i]) > O_R )                          if ( BDY(b)[i] && OID((Obj)BDY(b)[i]) > O_R )
                                 error("mulmatvect : invalid argument");                                  error("mulmatvect : invalid argument");
   #endif
                 arow = a->row; m = a->col;                  arow = a->row; m = a->col;
                 MKVECT(t,arow);                  MKVECT(t,arow);
                 for ( i = 0; i < arow; i++ ) {                  for ( i = 0; i < arow; i++ ) {

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.16

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