=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/mattran.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- OpenXM_contrib2/asir2000/builtin/mattran.c 2003/02/14 18:39:02 1.1 +++ OpenXM_contrib2/asir2000/builtin/mattran.c 2003/02/22 07:22:16 1.2 @@ -1,95 +1,309 @@ +/* + * $OpenXM$ + */ + #include "ca.h" #include "parse.h" -static void Rowm(NODE, Obj *); -static void Rowch(NODE, Obj *); -static void Rowmadd(NODE, Obj *); -//static void mlowch(NODE, Obj *, Obj *, Obj *); -//static void mlowad(NODE, Obj *, Obj *, Obj *); +static void MatFund(NODE, Obj *); +static void RowMul(NODE, Obj *); +static void RowExh(NODE, Obj *); +static void RowMulAdd(NODE, Obj *); +static void BodyRowMul(MAT, int, pointer); +static void BodyRowExh(MAT, int, int); +static void BodyRowMulAdd(MAT, int, int, pointer); +static void ColMul(NODE, Obj *); +static void ColExh(NODE, Obj *); +static void ColMulAdd(NODE, Obj *); +static void BodyColMul(MAT, int, pointer); +static void BodyColExh(MAT, int, int); +static void BodyColMulAdd(MAT, int, int, pointer); struct ftab mat_tab[] = { - {"rowm",Rowm,3}, - {"rowch",Rowch,3}, - {"rowmadd",Rowmadd,4}, + {"mfund",MatFund,-5}, + {"rowm",RowMul,3}, + {"rowx",RowExh,3}, + {"rowa",RowMulAdd,4}, + {"colm",ColMul,3}, + {"colx",ColExh,3}, + {"cola",ColMulAdd,4}, {0,0,0}, }; static void -Rowm(arg, rp) +MatFund(arg, rp) NODE arg; Obj *rp; { - MAT a; - Q s; - int row, size, i; - pointer *k, *t, *ap; - - a = (MAT)ARG0(arg); - size = a->col; - s = (Q)ARG1(arg); - row = QTOS(s); - k = (pointer)ARG2(arg); - ap = BDY(a)[row]; - for ( i = 0; i < size; i++ ) { - mulr(CO,(Obj)ap[i],(Obj)k,(Obj *)&t); - ap[i]=(Obj)t; + MAT mat; + pointer *coe; + Q rowq, row2q, colq, col2q; + int sw, row, row2, col, col2; + sw = QTOS( (Q)ARG0(arg) ); + mat = (MAT)ARG1(arg); + switch (sw) { + case 1: + rowq = (Q)ARG2(arg); + row = QTOS( rowq ); + coe = (pointer)ARG3(arg); + BodyRowMul( mat, row, coe ); + *rp = (Obj)mat; + return; + case 2: + rowq = (Q)ARG2(arg); + row = QTOS( rowq ); + row2q = (Q)ARG3(arg); + row2 = QTOS( row2q ); + BodyRowExh( mat, row, row2 ); + *rp = (Obj)mat; + return; + case 3: + rowq = (Q)ARG2(arg); + row = QTOS( rowq ); + row2q = (Q)ARG3(arg); + row2 = QTOS( row2q ); + coe = (pointer)ARG3(arg); + BodyRowMulAdd( mat, row, row2, coe ); + *rp = (Obj)mat; + return; + case 4: + colq = (Q)ARG2(arg); + col = QTOS( colq ); + coe = (pointer)ARG3(arg); + BodyColMul( mat, col, coe ); + *rp = (Obj)mat; + return; + case 5: + colq = (Q)ARG2(arg); + col = QTOS( colq ); + col2q = (Q)ARG3(arg); + col2 = QTOS( col2q ); + BodyColExh( mat, col, col2 ); + *rp = (Obj)mat; + return; + case 6: + colq = (Q)ARG2(arg); + col = QTOS( colq ); + col2q = (Q)ARG3(arg); + col2 = QTOS( col2q ); + coe = (pointer)ARG3(arg); + BodyColMulAdd( mat, col, col2, coe ); + *rp = (Obj)mat; + default: + return; + *rp = 0; } +} - *rp = (Obj)a; +static void +RowMul(arg, rp) +NODE arg; +Obj *rp; +{ + MAT mat; + Q rowq; + pointer *coe; + int row; + + mat = (MAT)ARG0(arg); + rowq = (Q)ARG1(arg); + row = QTOS( rowq ); + coe = (pointer)ARG2(arg); + BodyRowMul( mat, row , coe ); + *rp = (Obj)mat; } static void -Rowch(arg, rp) +RowExh(arg, rp) NODE arg; Obj *rp; { - MAT a; - Q sa, sb; - int rowa, rowb, size, i; - pointer *k, *t, *ap, *aq; + MAT mat; + Q QIndexA, QIndexB; + int IndexA, IndexB; - a = (MAT)ARG0(arg); - size = a->col; - sa = (Q)ARG1(arg); - rowa = QTOS(sa); - sb = (Q)ARG2(arg); - rowb = QTOS(sb); - ap = BDY(a)[rowa]; - aq = BDY(a)[rowb]; - for ( i = 0; i < size; i++ ) { - t = ap[i]; - ap[i] = aq[i]; - aq[i] = t; - } + mat = (MAT)ARG0(arg); + QIndexA = (Q)ARG1(arg); + QIndexB = (Q)ARG2(arg); + IndexA = QTOS( QIndexA ); + IndexB = QTOS( QIndexB ); + BodyRowExh( mat, IndexA, IndexB ); + *rp = (Obj)mat; +} - *rp = (Obj)a; +static void +RowMulAdd(arg, rp) +NODE arg; +Obj *rp; +{ + MAT mat; + Q QIndexA, QIndexB; + int IndexA, IndexB; + pointer *coe; + + mat = (MAT)ARG0(arg); + QIndexA = (Q)ARG1(arg); + QIndexB = (Q)ARG2(arg); + coe = (pointer)ARG3(arg); + IndexA = QTOS( QIndexA ); + IndexB = QTOS( QIndexB ); + BodyRowMulAdd( mat, IndexA, IndexB, coe ); + *rp = (Obj)mat; } static void -Rowmadd(arg, rp) +ColMul(arg, rp) NODE arg; Obj *rp; { - MAT a; - Q sa, sb; - int rowa, rowb, size, i; - pointer *k, *t, *ap, *aq; + MAT mat; + Q QIndex; + pointer *coe; + int Index; - a = (MAT)ARG0(arg); - size = a->col; - sa = (Q)ARG1(arg); - rowa = QTOS(sa); - sb = (Q)ARG2(arg); - rowb = QTOS(sb); - ap = BDY(a)[rowa]; - aq = BDY(a)[rowb]; - k = (pointer)ARG3(arg); + mat = (MAT)ARG0(arg); + QIndex = (Q)ARG1(arg); + Index = QTOS( QIndex ); + coe = (pointer)ARG2(arg); + BodyColMul( mat, Index , coe ); + *rp = (Obj)mat; +} +static void +ColExh(arg, rp) +NODE arg; +Obj *rp; +{ + MAT mat; + Q QIndexA, QIndexB; + int IndexA, IndexB; + + mat = (MAT)ARG0(arg); + QIndexA = (Q)ARG1(arg); + QIndexB = (Q)ARG2(arg); + IndexA = QTOS( QIndexA ); + IndexB = QTOS( QIndexB ); + BodyColExh( mat, IndexA, IndexB ); + *rp = (Obj)mat; +} + +static void +ColMulAdd(arg, rp) +NODE arg; +Obj *rp; +{ + MAT mat; + Q QIndexA, QIndexB; + int IndexA, IndexB; + pointer *coe; + + mat = (MAT)ARG0(arg); + QIndexA = (Q)ARG1(arg); + QIndexB = (Q)ARG2(arg); + coe = (pointer)ARG3(arg); + IndexA = QTOS( QIndexA ); + IndexB = QTOS( QIndexB ); + BodyColMulAdd( mat, IndexA, IndexB, coe ); + *rp = (Obj)mat; +} + +static void +BodyRowMul( mat, row, coe ) +MAT mat; +int row; +pointer coe; +{ + int size, i; + pointer *t, *matrow; + + size = mat->col; + matrow = BDY(mat)[row]; for ( i = 0; i < size; i++ ) { - mulr( CO, (Obj)ap[i], (Obj)k, (Obj *)&t ); - addr( CO, (Obj)aq[i], (Obj)t, (Obj *)&t ); - aq[i] = t; + mulr(CO,(Obj)matrow[i],(Obj)coe,(Obj *)&t); + matrow[i]=(Obj)t; } +} - *rp = (Obj)a; +static void +BodyRowExh( mat, IndexA, IndexB ) +MAT mat; +int IndexA, IndexB; +{ + int i, size; + pointer *t, *PRowA, *PRowB; + + size = mat->col; + PRowA = BDY(mat)[IndexA]; + PRowB = BDY(mat)[IndexB]; + for ( i = 0; i < size; i++ ) { + t = PRowA[i]; + PRowA[i] = PRowB[i]; + PRowB[i] = t; + } +} + +static void +BodyRowMulAdd( mat, IndexA, IndexB, coe ) +MAT mat; +int IndexA, IndexB; +pointer coe; +{ + int i, size; + pointer *t, *PRowA, *PRowB; + + size = mat->col; + PRowA = BDY(mat)[IndexA]; + PRowB = BDY(mat)[IndexB]; + + for ( i = 0; i < size; i++ ) { + mulr( CO, (Obj)PRowB[i], (Obj)coe, (Obj *)&t ); + addr( CO, (Obj)PRowA[i], (Obj)t, (Obj *)&t ); + PRowA[i] = t; + } +} + +static void +BodyColMul( mat, Index, coe ) +MAT mat; +int Index; +pointer coe; +{ + int size, i; + + size = mat->row; + for ( i = 0; i < size; i++ ) { + mulr(CO, BDY(mat)[i][Index], (Obj)coe, (Obj *)&BDY(mat)[i][Index]); + } +} + +static void +BodyColExh( mat, IndexA, IndexB ) +MAT mat; +int IndexA, IndexB; +{ + int i, size; + pointer *t; + + size = mat->row; + for ( i = 0; i < size; i++ ) { + t = BDY(mat)[i][IndexA]; + BDY(mat)[i][IndexA] = BDY(mat)[i][IndexB]; + BDY(mat)[i][IndexB] = t; + } +} + +static void +BodyColMulAdd( mat, IndexA, IndexB, coe ) +MAT mat; +int IndexA, IndexB; +pointer coe; +{ + int i, size; + pointer *t; + + size = mat->row; + for ( i = 0; i < size; i++ ) { + mulr( CO, BDY(mat)[i][IndexB], coe, (Obj *)&t ); + addr( CO, BDY(mat)[i][IndexA], (Obj)t, (Obj *)&BDY(mat)[i][IndexA]); + } }