diff --git a/src/lib/f_func.ts b/src/lib/f_func.ts index 688b900..e502ece 100644 --- a/src/lib/f_func.ts +++ b/src/lib/f_func.ts @@ -264,6 +264,8 @@ export interface Matrix { lowerBand(value: number): Matrix; packedUpper(value?: number): FortranArr; packedLower(value?: number): FortranArr; + real(): Matrix; + imaginary(): Matrix; toArr(): Complex[] | number[]; } @@ -446,11 +448,102 @@ function mimicFMatrix(r: fpArray, i?: fpArray) { } } return this; + }, + real() { + let reC: fpArray; + reC = this.r.slice(); + return mimicFMatrix(reC)(this.nrCols, this.colSize); + }, + imaginary() { + let imC: fpArray; + if (!this.i) { + imC = new Float64Array(this.nrCols * this.colSize); + imC.fill(0); + } + else { + imC = this.i.slice(); //copy + } + return mimicFMatrix(imC)(this.nrCols, this.colSize); } }); } } +export function real(data: number | number[] | Complex | Complex[]): number[] | number { + + if (data === null) { + throw new Error('"null" inserted as argument'); + } + + if (data === undefined) { + throw new Error('"undefined inserted as argument'); + } + + if (typeof data === 'object' && 're' in data) { + return data.re; + } + if (typeof data === 'number') { + return data; + } + if (data instanceof Array) { + const copy: number[] = new Array(data.length); + for (let i = 0; i < data.length; i++) { + const c = data[i]; + if (typeof c === 'number') { + copy[i] = c; + continue; + } + if (c === undefined || c === null) { + copy[i] = c; + continue; + } + if ('re' in c) { + copy[i] = c['re']; + continue; + } + copy[i] = NaN; + + } + return copy; + } + throw new Error('should not be here'); +} + +export function imaginary(data: number | number[] | Complex | Complex[]): number[] | number { + + if (data === null) { + throw new Error('"null" inserted as argument'); + } + + if (data === undefined) { + throw new Error('"undefined inserted as argument'); + } + + if (typeof data === 'object' && 'im' in data) { + return data.im; + } + + if (typeof data === 'number') { + return 0; + } + + if (data instanceof Array) { + const copy: number[] = new Array(data.length); + for (let i = 0; i <= data.length; i++) { + if (typeof data[i] === 'number') { + copy[i] = 0; + } else if ('im' in (data[i] as any)) { + copy[i] = data[i]['im']; + } + else { + copy[i] = NaN; + } + } + return copy; + } + throw new Error('should not be here'); +} + export function fortranMatrixComplex32(...rest: (Complex | Complex[])[]): (nrRows: number, nrCols: number, matrixType?: MatrixType, rowBase?: number, colBase?: number) => Matrix { diff --git a/src/lib/l3/single/sgemm.ts b/src/lib/l3/single/sgemm.ts index 1ec4ddc..af162c8 100644 --- a/src/lib/l3/single/sgemm.ts +++ b/src/lib/l3/single/sgemm.ts @@ -1,4 +1,4 @@ -import { errWrongArg, Matrix } from '../../f_func'; +import { errWrongArg, lowerChar, Matrix } from '../../f_func'; /* -- Jacob Bogers, 03/2008, JS port, jkfbogers@gmail.cmom *> -- Written on 8-February-1989. @@ -26,8 +26,8 @@ export function sgemm( ldc: number): void { // faster then String.toLowerCase() - const trA: 'n' | 't' | 'c' = String.fromCharCode(transA.charCodeAt(0) | 0X20) as any; - const trB: 'n' | 't' | 'c' = String.fromCharCode(transB.charCodeAt(0) | 0X20) as any; + const trA = lowerChar(transA); + const trB = lowerChar(transB); const notA = trA === 'n'; const notB = trB === 'n'; @@ -36,15 +36,15 @@ export function sgemm( //ncolA is never used, I checked in the original F-code // also checked online http://www.netlib.org/lapack/explore-html/db/dc9/group__single__blas__level3_gafe51bacb54592ff5de056acabd83c260.html#gafe51bacb54592ff5de056acabd83c260 // ncolA is not used - //const ncolA = notA ? k : n; + // const ncolA = notA ? k : n; const nrowB = notB ? k : n; let info = 0; - if (!notA && trA !== 'c' && trA !== 't') { + if (!'ntc'.includes(trA)) { info = 1; } - else if (!notB && trB !== 'c' && trB !== 't') { + else if (!'ntc'.includes(trB)) { info = 2; } else if (m < 0) { @@ -62,7 +62,7 @@ export function sgemm( else if (ldb < max(1, nrowB)) { info = 10; } - else if (ldb < max(1, m)) { + else if (ldc < max(1, m)) { info = 13; } // ok? @@ -80,11 +80,18 @@ export function sgemm( if (alpha === 0) { if (beta === 0) { - c.r.fill(0); //fast + for (let j = 1; j <= n; j++) { + c.setCol(j, 1, m, 0); + } } else { // I have to typecast it this way for TS compiler not to nag!! - (c.r as Float32Array).set((c.r as Float32Array).map(v => v * beta), 0); + for (let j = 1; j <= n; j++) { + const coorCJ = c.colOfEx(j); + for (let i = 1; i <= m; i++) { + c.r[coorCJ + i] *= beta; + } + } } return; } diff --git a/test/generate-fixtures/sgemm/Makefile b/test/generate-fixtures/sgemm/Makefile new file mode 100644 index 0000000..577f91b --- /dev/null +++ b/test/generate-fixtures/sgemm/Makefile @@ -0,0 +1,2 @@ +test.exe : dgemm.f tests.f ../_shared/lsame.f ../_shared/xerbla.f + gfortran dgemm.f tests.f ../_shared/lsame.f ../_shared/xerbla.f -o test.exe \ No newline at end of file diff --git a/test/generate-fixtures/sgemm/dgemm.f b/test/generate-fixtures/sgemm/dgemm.f new file mode 100644 index 0000000..3a60ca4 --- /dev/null +++ b/test/generate-fixtures/sgemm/dgemm.f @@ -0,0 +1,384 @@ +*> \brief \b DGEMM +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) +* +* .. Scalar Arguments .. +* DOUBLE PRECISION ALPHA,BETA +* INTEGER K,LDA,LDB,LDC,M,N +* CHARACTER TRANSA,TRANSB +* .. +* .. Array Arguments .. +* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DGEMM performs one of the matrix-matrix operations +*> +*> C := alpha*op( A )*op( B ) + beta*C, +*> +*> where op( X ) is one of +*> +*> op( X ) = X or op( X ) = X**T, +*> +*> alpha and beta are scalars, and A, B and C are matrices, with op( A ) +*> an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] TRANSA +*> \verbatim +*> TRANSA is CHARACTER*1 +*> On entry, TRANSA specifies the form of op( A ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSA = 'N' or 'n', op( A ) = A. +*> +*> TRANSA = 'T' or 't', op( A ) = A**T. +*> +*> TRANSA = 'C' or 'c', op( A ) = A**T. +*> \endverbatim +*> +*> \param[in] TRANSB +*> \verbatim +*> TRANSB is CHARACTER*1 +*> On entry, TRANSB specifies the form of op( B ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSB = 'N' or 'n', op( B ) = B. +*> +*> TRANSB = 'T' or 't', op( B ) = B**T. +*> +*> TRANSB = 'C' or 'c', op( B ) = B**T. +*> \endverbatim +*> +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> On entry, M specifies the number of rows of the matrix +*> op( A ) and of the matrix C. M must be at least zero. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> On entry, N specifies the number of columns of the matrix +*> op( B ) and the number of columns of the matrix C. N must be +*> at least zero. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> On entry, K specifies the number of columns of the matrix +*> op( A ) and the number of rows of the matrix op( B ). K must +*> be at least zero. +*> \endverbatim +*> +*> \param[in] ALPHA +*> \verbatim +*> ALPHA is DOUBLE PRECISION. +*> On entry, ALPHA specifies the scalar alpha. +*> \endverbatim +*> +*> \param[in] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is +*> k when TRANSA = 'N' or 'n', and is m otherwise. +*> Before entry with TRANSA = 'N' or 'n', the leading m by k +*> part of the array A must contain the matrix A, otherwise +*> the leading k by m part of the array A must contain the +*> matrix A. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> On entry, LDA specifies the first dimension of A as declared +*> in the calling (sub) program. When TRANSA = 'N' or 'n' then +*> LDA must be at least max( 1, m ), otherwise LDA must be at +*> least max( 1, k ). +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is +*> n when TRANSB = 'N' or 'n', and is k otherwise. +*> Before entry with TRANSB = 'N' or 'n', the leading k by n +*> part of the array B must contain the matrix B, otherwise +*> the leading n by k part of the array B must contain the +*> matrix B. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> On entry, LDB specifies the first dimension of B as declared +*> in the calling (sub) program. When TRANSB = 'N' or 'n' then +*> LDB must be at least max( 1, k ), otherwise LDB must be at +*> least max( 1, n ). +*> \endverbatim +*> +*> \param[in] BETA +*> \verbatim +*> BETA is DOUBLE PRECISION. +*> On entry, BETA specifies the scalar beta. When BETA is +*> supplied as zero then C need not be set on input. +*> \endverbatim +*> +*> \param[in,out] C +*> \verbatim +*> C is DOUBLE PRECISION array, dimension ( LDC, N ) +*> Before entry, the leading m by n part of the array C must +*> contain the matrix C, except when beta is zero, in which +*> case C need not be set on entry. +*> On exit, the array C is overwritten by the m by n matrix +*> ( alpha*op( A )*op( B ) + beta*C ). +*> \endverbatim +*> +*> \param[in] LDC +*> \verbatim +*> LDC is INTEGER +*> On entry, LDC specifies the first dimension of C as declared +*> in the calling (sub) program. LDC must be at least +*> max( 1, m ). +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date December 2016 +* +*> \ingroup double_blas_level3 +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> Level 3 Blas routine. +*> +*> -- Written on 8-February-1989. +*> Jack Dongarra, Argonne National Laboratory. +*> Iain Duff, AERE Harwell. +*> Jeremy Du Croz, Numerical Algorithms Group Ltd. +*> Sven Hammarling, Numerical Algorithms Group Ltd. +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) +* +* -- Reference BLAS level3 routine (version 3.7.0) -- +* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* December 2016 +* +* .. Scalar Arguments .. + DOUBLE PRECISION ALPHA,BETA + INTEGER K,LDA,LDB,LDC,M,N + CHARACTER TRANSA,TRANSB +* .. +* .. Array Arguments .. + DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) +* .. +* +* ===================================================================== +* +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. External Subroutines .. + EXTERNAL XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX +* .. +* .. Local Scalars .. + DOUBLE PRECISION TEMP + INTEGER I,INFO,J,L,NCOLA,NROWA,NROWB + LOGICAL NOTA,NOTB +* .. +* .. Parameters .. + DOUBLE PRECISION ONE,ZERO + PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) +* .. +* +* Set NOTA and NOTB as true if A and B respectively are not +* transposed and set NROWA, NCOLA and NROWB as the number of rows +* and columns of A and the number of rows of B respectively. +* + NOTA = LSAME(TRANSA,'N') + NOTB = LSAME(TRANSB,'N') + IF (NOTA) THEN + NROWA = M + NCOLA = K + ELSE + NROWA = K + NCOLA = M + END IF + IF (NOTB) THEN + NROWB = K + ELSE + NROWB = N + END IF +* +* Test the input parameters. +* + INFO = 0 + IF ((.NOT.NOTA) .AND. (.NOT.LSAME(TRANSA,'C')) .AND. + + (.NOT.LSAME(TRANSA,'T'))) THEN + INFO = 1 + ELSE IF ((.NOT.NOTB) .AND. (.NOT.LSAME(TRANSB,'C')) .AND. + + (.NOT.LSAME(TRANSB,'T'))) THEN + INFO = 2 + ELSE IF (M.LT.0) THEN + INFO = 3 + ELSE IF (N.LT.0) THEN + INFO = 4 + ELSE IF (K.LT.0) THEN + INFO = 5 + ELSE IF (LDA.LT.MAX(1,NROWA)) THEN + INFO = 8 + ELSE IF (LDB.LT.MAX(1,NROWB)) THEN + INFO = 10 + ELSE IF (LDC.LT.MAX(1,M)) THEN + INFO = 13 + END IF + IF (INFO.NE.0) THEN + CALL XERBLA('DGEMM ',INFO) + RETURN + END IF +* +* Quick return if possible. +* + IF ((M.EQ.0) .OR. (N.EQ.0) .OR. + + (((ALPHA.EQ.ZERO).OR. (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN +* +* And if alpha.eq.zero. +* + IF (ALPHA.EQ.ZERO) THEN + IF (BETA.EQ.ZERO) THEN + DO 20 J = 1,N + DO 10 I = 1,M + C(I,J) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + DO 40 J = 1,N + DO 30 I = 1,M + C(I,J) = BETA*C(I,J) + 30 CONTINUE + 40 CONTINUE + END IF + RETURN + END IF +* +* Start the operations. +* + IF (NOTB) THEN + IF (NOTA) THEN +* +* Form C := alpha*A*B + beta*C. +* + DO 90 J = 1,N + IF (BETA.EQ.ZERO) THEN + DO 50 I = 1,M + C(I,J) = ZERO + 50 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 60 I = 1,M + C(I,J) = BETA*C(I,J) + 60 CONTINUE + END IF + DO 80 L = 1,K + TEMP = ALPHA*B(L,J) + DO 70 I = 1,M + C(I,J) = C(I,J) + TEMP*A(I,L) + 70 CONTINUE + 80 CONTINUE + 90 CONTINUE + ELSE +* +* Form C := alpha*A**T*B + beta*C +* + DO 120 J = 1,N + DO 110 I = 1,M + TEMP = ZERO + DO 100 L = 1,K + TEMP = TEMP + A(L,I)*B(L,J) + 100 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 110 CONTINUE + 120 CONTINUE + END IF + ELSE + IF (NOTA) THEN +* +* Form C := alpha*A*B**T + beta*C +* + DO 170 J = 1,N + IF (BETA.EQ.ZERO) THEN + DO 130 I = 1,M + C(I,J) = ZERO + 130 CONTINUE + ELSE IF (BETA.NE.ONE) THEN + DO 140 I = 1,M + C(I,J) = BETA*C(I,J) + 140 CONTINUE + END IF + DO 160 L = 1,K + TEMP = ALPHA*B(J,L) + DO 150 I = 1,M + C(I,J) = C(I,J) + TEMP*A(I,L) + 150 CONTINUE + 160 CONTINUE + 170 CONTINUE + ELSE +* +* Form C := alpha*A**T*B**T + beta*C +* + DO 200 J = 1,N + DO 190 I = 1,M + TEMP = ZERO + DO 180 L = 1,K + TEMP = TEMP + A(L,I)*B(J,L) + 180 CONTINUE + IF (BETA.EQ.ZERO) THEN + C(I,J) = ALPHA*TEMP + ELSE + C(I,J) = ALPHA*TEMP + BETA*C(I,J) + END IF + 190 CONTINUE + 200 CONTINUE + END IF + END IF +* + RETURN +* +* End of DGEMM . +* + END diff --git a/test/generate-fixtures/sgemm/tests.f b/test/generate-fixtures/sgemm/tests.f new file mode 100644 index 0000000..69d7347 --- /dev/null +++ b/test/generate-fixtures/sgemm/tests.f @@ -0,0 +1,213 @@ + PROGRAM test + +c x := A*x, or x := A**T*x, +c +c HELPERS +c +c SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + + + EXTERNAL dgemm, COPY, ZEROA, copyma,FILL + EXTERNAL FILLM, PRNMATR, PRNVEC + +* .. Scalar Arguments .. +* DOUBLE PRECISION ALPHA,BETA +* INTEGER K,LDA,LDB,LDC,M,N +* CHARACTER TRANSA,TRANSB +* .. +* .. Array Arguments .. +* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) + + DOUBLE PRECISION ALPHA,BETA + DOUBLE PRECISION A(6,6),B(6,6),C(6,6), M6X6(6,6) + + INTEGER K,LDA,LDB,LDC,M,N + CHARACTER TRANSA,TRANSB + + DATA ((M6X6(I,J),I=1,6), J=1,6)/ + + 1.2629542848807933, + + -0.3262333607056494, + + 1.3297992629225006, + + 1.2724293214294047, + + 0.4146414344564082, + + -1.5399500419037095, + + -0.9285670347135381, + + -0.2947204467905602, + + -0.005767172747536955, + + 2.404653388857951, + + 0.7635934611404596, + + -0.7990092489893682, + + -1.1476570092363514, + + -0.28946157368822334, + + -0.29921511789731614, + + -0.411510832795067, + + 0.2522234481561323, + + -0.8919211272845686, + + 0.43568329935571865, + + -1.237538421929958, + + -0.22426788527830935, + + 0.37739564598170106, + + 0.1333363608148414, + + 0.8041895097449078, + + -0.057106774383808755, + + 0.5036079722337261, + + 1.085769362145687, + + -0.6909538396968303, + + -1.2845993538721883, + + 0.04672617218835198, + + -0.23570655643950122, + + -0.5428882550102544, + + -0.4333103174567822, + + -0.6494716467962331, + + 0.726750747385451, + + 1.1519117540872/ +c +c DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) +c C := alpha*op( A )*op( B ) + beta*C, +c + PRINT *, "=====CASE 0=======" + + TRANSA = "N" + TRANSB = "N" + M = 4 + N = 6 + K = 3 + ALPHA = 0 + BETA=1 + + CALL COPYMA(M6X6, A, 6, 6) + CALL COPYMA(M6X6, B, 6, 6) + CALL COPYMA(M6X6, C, 6, 6) + LDA=6 + LDB=6 + LDC=6 + + CALL DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + + CALL PRNMATR(C, 6, 6) + + PRINT *, "=====CASE 4=======" + + TRANSA = "N" + TRANSB = "C" + M = 6 + N = 6 + K = 3 + ALPHA = 0 + BETA=0.75 + + CALL COPYMA(M6X6, A, 6, 6) + CALL COPYMA(M6X6, B, 6, 6) + CALL COPYMA(M6X6, C, 6, 6) + LDA=6 + LDB=6 + LDC=6 + + CALL DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) + CALL PRNMATR(C, 6, 6) + +*> DGEMM performs one of the matrix-matrix operations +*> +*> C := alpha*op( A )*op( B ) + beta*C, +*> +*> where op( X ) is one of +*> +*> op( X ) = X or op( X ) = X**T, +*> TRANSA is CHARACTER*1 +*> On entry, TRANSA specifies the form of op( A ) to be used in +*> the matrix multiplication as follows: +*> +*> TRANSA = 'N' or 'n', op( A ) = A. +*> +*> TRANSA = 'T' or 't', op( A ) = A**T. +*> +*> TRANSA = 'C' or 'c', op( A ) = A**T. + + end + + SUBROUTINE COPY(X,Y,N) + + INTEGER N + DOUBLE PRECISION X(*), Y(*) + + DO 20 I=1,N + Y(I)=X(I) +20 CONTINUE + END SUBROUTINE + + SUBROUTINE COPYMA(AC,A,N,LDA) + + INTEGER N, LDA + DOUBLE PRECISION AC(LDA, *), A(LDA,*) + + DO 40 J = 1, N + DO 50 I = 1, LDA + A(I,J)=AC(I,J); +50 CONTINUE +40 CONTINUE + END SUBROUTINE + + SUBROUTINE ZEROA(X,N) + + INTEGER N + DOUBLE PRECISION X(*) + + DO 20 I=1,N + X(I)=0.0 +20 CONTINUE + + END SUBROUTINE + + SUBROUTINE FILL(X,N, V) + + INTEGER N + DOUBLE PRECISION X(*),V + + DO 20 I=1,N + X(I)=V +20 CONTINUE + + END SUBROUTINE + + SUBROUTINE FILLM(MM,N,M, V) + + INTEGER N,M + DOUBLE PRECISION MM(M,*),V + + DO 20 J=1,N + DO I=1,M + MM(I,J)=V +40 END DO +20 CONTINUE + + END SUBROUTINE + + SUBROUTINE PRNMATR(A, N, M) + + INTEGER N,M + DOUBLE PRECISION A(M,*) + PRINT *, '[' + DO J=1,N + DO I=1,M + PRINT *, A(I,J), "," + END DO + END DO + + PRINT *, ']' + + END SUBROUTINE + + SUBROUTINE PRNVEC(X, N) + + INTEGER N + DOUBLE PRECISION X(*) + + PRINT *, '[' + DO J=1,N + PRINT *, X(J), ", " + END DO + + PRINT *, ']' + + END SUBROUTINE + diff --git a/test/level2/complex/test.ts b/test/level2/complex/test.ts index db0b93c..98c9ab7 100644 --- a/test/level2/complex/test.ts +++ b/test/level2/complex/test.ts @@ -348,11 +348,7 @@ describe('blas level 2 single/double complex', function n() { y }, expect, desc }, key) => { it(`[${key}]/[${desc}]`, function t() { - chemv(uplo, n, alpha, a, lda, x, incx, beta, y, incy); - - //console.log(`y.arr:`, y.toArr()) - //console.log(`expect.y`, expect.y); const approx = approximatelyWithPrec(1E-5); multiplexer(y.toArr(), expect.y)(approx); }); diff --git a/test/level3/double/dgemm/fixtures.ts b/test/level3/double/dgemm/fixtures.ts new file mode 100644 index 0000000..89a6055 --- /dev/null +++ b/test/level3/double/dgemm/fixtures.ts @@ -0,0 +1,2065 @@ +import { + complex, + fortranArrComplex64 as arr64, + fortranMatrixComplex64 +} from '../../../../src/lib/f_func'; + + + +import { + diagonal_nxn, + matrix_mxn, + vector +} from '../../../matrices'; + +const pI = Infinity; +const nI = -Infinity; +const { PI, sin, cos, abs, sqrt } = Math; + +const cospi = x => cos(PI * x); +const sinpi = x => sin(PI * x); + + +export const fixture = { + dgemm: { + case0: { + desc: '(trivial) n=0', + input: { + cmd: 'xdebug', + trA: 'n', + trB: 'n', + m: 6, + n: 0, + k: 4, + lda: 8, + ldb: 8, + ldc: 8, + beta: 0.2, + alpha: 0.3, + a: matrix_mxn(8, 8).real(), + b: matrix_mxn(8, 8).real(), + c: matrix_mxn(8, 8).real(), + }, + expect: { + c: matrix_mxn(8, 8).real().toArr() + }, + }, + case1: { + desc: '(trivial m=0)', + input: { + trA: 'n', + trB: 'n', + m: 0, + n: 8, + k: 4, + lda: 8, + ldb: 8, + ldc: 8, + beta: 0, + alpha: 0, + a: matrix_mxn(8, 8).real(), + b: matrix_mxn(8, 8).real(), + c: matrix_mxn(8, 8).real(), + }, + expect: { + c: matrix_mxn(8, 8).real().toArr() + }, + }, + case2: { + desc: '(trivial) alpha=0, beta=1', + input: { + trA: 'n', + trB: 'n', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: 1, + alpha: 0, + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8).real(), + b: matrix_mxn(8, 8).real(), + c: matrix_mxn(8, 8).real(), + }, + expect: { + c: matrix_mxn(8, 8).real().toArr() + }, + }, + case3: { + desc: '(near trivial), alpha=0, beta=0', + input: { + cmd: 'xdebug', + trA: 'n', + trB: 'c', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: 0, + alpha: 0, + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8).real(), + b: matrix_mxn(8, 8).real(), + c: matrix_mxn(8, 8).real(), + }, + expect: { + c: (() => { + const m = matrix_mxn(8, 8).real(); + for (let i = 1; i <= 8; i++) { + m.setCol(i, 1, 6, 0); + } + return m.toArr(); + })(), + }, + }, + case4: { + desc: '( near trivial) alpha=0 beta !=1 and beta != 0', + input: { + trA: 'n', + trB: 'c', + m: 6, // A(M,K), C(M,N) + n: 6, // B(K,N), A(M,K) + k: 3, + lda: 6, // lda >= M + ldb: 6, // ldb >= K + ldc: 6, // ldc >= M + beta: 0.75, + alpha: 0, + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(6, 6).real(), + b: matrix_mxn(6, 6).real(), + c: matrix_mxn(6, 6).real(), + }, + expect: { + c: [ + 0.94721567630767822, + -0.24467501789331436, + 0.99734947085380554, + 0.95432201027870178, + 0.31098107993602753, + -1.1549625098705292, + -0.69642528891563416, + -0.22104033082723618, + -4.3253795010969043E-003, + 1.8034899830818176, + 0.57269507646560669, + -0.59925694763660431, + -0.86074277758598328, + -0.21709618717432022, + -0.22441133111715317, + -0.30863311886787415, + 0.18916759639978409, + -0.66894082725048065, + 0.32676248252391815, + -0.92815384268760681, + -0.16820091381669044, + 0.28304674476385117, + 0.10000227391719818, + 0.60314212739467621, + -4.2830080725252628E-002, + 0.37770599126815796, + 0.81432706117630005, + -0.51821538805961609, + -0.96344947814941406, + 3.5044628195464611E-002, + -0.17677991464734077, + -0.40716621279716492, + -0.32498274743556976, + -0.48710373044013977, + 0.54506304860115051, + 0.86393380165100098, + ] + } + }, + case5: { + desc: 'trA="n", trB="n",s m=4,n=6, k=3, ld[x]=6, n_a=m_b=k=4, alpha(0.3,-0.7), beta(1, 0)', + input: { + trA: 'n', + trB: 'n', + m: 4, // A(M,K), C(M,N) + n: 6, // B(K,N), A(M,K) + k: 3, + lda: 6, // lda >= M + ldb: 6, // ldb >= K + ldc: 6, // ldc >= M + beta: -1.2, + alpha: 0.3, + a: matrix_mxn(6, 6).real(), + b: matrix_mxn(6, 6).real(), + c: matrix_mxn(6, 6).real(), + }, + expect: { + c: [ + complex(4.2918085769962042, -6.0751660167388932), + complex(2.2038695715499683, 2.1531581107630582), + complex(2.4328679290078541, -1.8554559313760945), + complex(1.9063328296708064, -0.24112156892875430), + complex(2.3490824877864549, 0.48439118249685514), + complex(-1.3161072410735419, 1.7865869291142316), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-3.6208759269114532, -1.2175616360241943), + complex(5.0718277697592740, -7.2889973377224759), + complex(-0.40370692200667702, -4.3418623664292042), + complex(-0.76043737221052221, 3.5682295399669002), + complex(-3.3279006248787608, 4.4268501869630841), + complex(-1.1866504704396392, -0.30465587229016994), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(1.7317956089603841, -0.49103688541219626), + complex(1.9248269695199232, -1.8659699540444326), + complex(3.0117234763348399, -6.0656375217354910), + complex(-4.0512294090840042, 0.92239467640771922), + complex(-1.1069109826302885, 0.41321495696323673), + complex(1.6059259819611416, 1.3666040343219410), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-0.52196154056319655, -7.3942815142402030E-002), + complex(-1.2693913888660817, 1.6242592751283775), + complex(2.5394416780768498, 1.5604742552435467), + complex(1.0364490378572464, -4.1464318365224919), + complex(1.6187133358777719, -2.3298357413400104), + complex(-0.23887919038576294, 2.3721828635149094), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(-0.84520922621496353, -2.0306735816304049), + complex(-1.7489888061113090, 4.1232597538596680), + complex(1.4839388721495250, 0.51691292696707081), + complex(0.24659996689859631, -2.8897963577015791), + complex(3.3976985009182927, -4.3499677287053382), + complex(1.6644345331414154, 0.53683515643313440), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(0.71585088459327306, 1.0979558417000270), + complex(1.2354925534454970, -0.94359057333195129), + complex(-2.4146593125766769, -0.75665630759566471), + complex(-2.1774295592325750, 1.3810070979876488), + complex(-3.2356529679360677, -0.92685449759988636), + complex(-0.14925563504454614, 0.26653846715721108), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(-1.0100552465778656, 4.5457779842942969), + complex(-0.92249138097236516, -1.4500727491261478), + complex(1.6268266536383225, 1.2578589742813135), + complex(-2.7290142678078788, -0.67264376487369670), + complex(-0.13577297506610231, -0.39095448974121894), + complex(-0.58430144053677591, -1.8621436658734820), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(1.9166603506349260, 3.2121012270292875), + complex(-0.73173931579550622, 0.24078701172934919), + complex(-1.1176229154721082, 1.9839986706563275), + complex(-2.1099488071108792, 1.4589808032036202), + complex(-0.11284308207184601, 1.3883452109598082), + complex(-0.66879380342570194, -0.42204763132531598), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case6: { + desc: 'trA="t", trB="c" m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k=4, alpha(0.3,-0.7), beta(0.2,0.8)', + input: { + trA: 't', + trB: 'c', + m: 6, // sA(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0.8), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(-1.2876777400237049, -4.3046848475243040), + complex(-1.1376970875607770, 1.6149181880850949), + complex(1.2228680122060407, -1.0107360295733425), + complex(-1.1166962295386758, 1.7128466818299062), + complex(-2.9065888199001435, 0.10139279158079151), + complex(0.27939544316471343, -2.3208521074698938), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-0.81009645624525806, 1.2459405287462044), + complex(5.6715494281201027, -2.7010584129112569), + complex(-1.7462852905775264, 1.7644886022274335), + complex(0.47464225474195265, -0.17061369346820299), + complex(-1.4693045794839787, 0.39657174058554423), + complex(-0.50940394716140180, -3.0046823301242349), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(3.9652583038708000E-002, -3.0233879730072921), + complex(1.4989677264990013, -0.85177988640486868), + complex(0.91929528585462095, -1.4251037063186247), + complex(-0.11093459271046086, -1.3371847451355219), + complex(0.51644936453880375, 1.7613253414957397E-002), + complex(-0.73149334713773295, -4.2100235361629110), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-5.7364310216026948E-002, 1.0316626095087102), + complex(-2.8105551147691394, 2.2590085580048225), + complex(4.0218552984848568, 2.2330157746901174), + complex(-1.6816764135304640E-002, 0.82521240528163964), + complex(0.32195979079717829, 0.22520148482711333), + complex(2.1434124116920414, 0.39658296834189855), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(-0.40569224644850760, -1.4631689034116837), + complex(-4.6649740479126418, 3.1681241437947727), + complex(2.3795424553413360, -3.4323678296590812), + complex(-0.64476698969545843, 0.53974500999977604), + complex(-7.7606860952297296E-003, 2.0404815368284712), + complex(-0.71427347386705298, -1.0961166378954434), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-1.5223450807930470, 1.5877572067774479), + complex(2.9655108729034638, 1.0824984849067836), + complex(-1.3241231658588697, -2.7175660039789205), + complex(-1.9158258313920179E-002, -1.3074119563138180), + complex(-0.12696794740557352, -2.0233528430039645), + complex(-3.7634253995821041, 0.92628395290652255), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(3.2566925693405766, 4.7782975737867650), + complex(1.2676534847649594, -1.1434764845869951), + complex(-1.8349915084811075, 0.20988840999540426), + complex(1.5338538310828429, -1.7421235878552461), + complex(2.3100963123069853, 2.9390335214936840), + complex(-0.44579794410430340, -1.4281922587238971), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(1.8681918657483916, 2.9351078257206291), + complex(1.5515774332607888, -2.4279708360605605), + complex(-0.41464466683087031, -1.4817772045559905), + complex(0.35745451574262255, -1.8952168565050500), + complex(-5.7686689496757426E-002, 4.0815657240377390E-002), + complex(0.71839337906420686, 4.3638717290857498E-002), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case7: { + desc: 'trA="t", trB="c" m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k, alpha(0.3,-0.7), beta(0,0)', + input: { + trA: 't', + trB: 'c', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0, 0), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(-0.74654027506620757, -5.5134803295756090), + complex(-1.4160608977180136, 1.9618074983688945), + complex(1.9475514746571925, -2.3222363123303307), + complex(-1.5946591358689468, 0.75077244731337156), + complex(-1.5831946089149274, -0.58190099034485354), + complex(1.0359823160491488, -1.2010412949994160), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-1.7421994709953363, 1.4838683792746807), + complex(4.3381462500629810, -4.4116629630136774), + complex(-3.1500296752797374, 1.4663702687369675), + complex(1.5596737683886670, 0.23728631222851093), + complex(-0.57413547492024941, 1.1482879602449354), + complex(-0.63337458275390168, -2.7276473220955637), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(1.9422995404160066, -3.7134396581326978), + complex(1.0410806542653384, 2.0824830501152913E-002), + complex(0.78825664197236656, -1.7626748643935275), + complex(0.33668616343317986, -0.39718223011749842), + complex(1.0558975712533176, 7.3378906902485552E-002), + complex(-0.94507128243966165, -4.4774153678498818), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(0.24104015761112124, 1.0056022514305232), + complex(-2.9201130967006765, 1.8583312570051020), + complex(3.0521820796136030, 1.5525300629891161), + complex(2.8713746491883296E-002, 1.4011405595106867), + complex(-7.3095318391603437E-002, 1.4158746869643628), + complex(2.3278779650720769, 0.31074933411686334), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(-0.12030005316995368, -1.1662031658160401), + complex(-4.4828491741832206, 3.6746438280874418), + complex(2.2495174197510295, -4.0175997017144907), + complex(-0.66927863728513670, -0.43325206789737125), + complex(0.80417063808768763, 0.99416237031241850), + complex(-0.88935754286700008, -0.68725948291727024), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-1.5422125489693443, 9.8506417354894515E-002), + complex(1.6214016276015433, 0.94189162646544777), + complex(-1.9764200226838764, -2.1696254078165329), + complex(-8.8525954202315710E-002, -0.58283322518556169), + complex(0.10173242671639599, -1.0889429591522592), + complex(-1.6265845951119109, 1.2978257923204908), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(2.1721575027875941, 4.3421912907761291), + complex(1.0815499532537789, -0.90372121410953232), + complex(-2.1275910716714419, 5.6821540124579628E-002), + complex(1.2799857123516405, -1.3584592363969299), + complex(2.0236021721812616, 0.93549717786646491), + complex(-1.0002670132643634, -0.61353673997371372), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(1.5651288977466837, 2.4853667743784245), + complex(1.8880186660678473, -2.3653511668821392), + complex(0.13680449719385757, 0.27067580302960931), + complex(1.2535290148739815, -1.0451632115788949), + complex(-0.17511788781701504, -0.23474610052625317), + complex(1.1234888714435070, -4.8246499122360509E-002), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479) + ] + }, + }, + case8: { + desc: 'trA="t", trB="n" m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k, alpha(0.3, -0.7), beta(0.2, 0.8)', + input: { + trA: 't', + trB: 'n', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0.8), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(3.9096422916281544, 1.2034085963285970), + complex(-0.19413875177534923, -2.3442696055949512), + complex(1.9464392664377108, 4.9517507508849956), + complex(1.0340547442007457, 0.28893588716060326), + complex(5.3517003131500207E-003, -0.34351063948865046), + complex(-0.23138141782270227, -1.2021963555315101), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(0.45960045281749251, -2.2353081458396282), + complex(-4.9925970895424614, -1.6008542636319940), + complex(-0.89337750835347185, -1.3497813549939321), + complex(-3.1213519580381739, -2.6578564830410460), + complex(-0.49455351594407060, 0.93875159604524860), + complex(-5.0164056889139754, -1.9736803992804741), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(0.76847577151156399, 4.3303021532534132), + complex(-1.8392348208220199, -2.5205044053904198), + complex(0.29600740032183448, 3.7871415687866108), + complex(-1.1173948354420622, -1.1916939916014457), + complex(-1.3356099992327390, 0.64434980850432155), + complex(3.3524594402636114, 2.8046517279999028), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(0.25768737004332648, -0.64707798927774418), + complex(-1.9267624624599224, -1.8492791763446119), + complex(0.29989913957283232, 0.42879423511757903), + complex(-1.1339707022899357, -1.7766410268450072), + complex(-0.48239993315447283, -1.2769456221699438), + complex(-0.74683875798282684, 0.51434590764802346), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(1.0433537180198125, -1.3237701590099391), + complex(0.21849071489023797, 1.1839481314119706), + complex(-0.66613675692791885, 1.2853473340472590), + complex(-0.85294339475357628, 0.88672465786445298), + complex(0.11212643362204910, -0.48994853525986382), + complex(-0.48192425085089829, 1.2337083353554068), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(0.54507292323803047, 1.4068652463615210), + complex(-3.7962670792045543, -1.5560385328104671), + complex(3.7911783617866894, 1.9893193001505445), + complex(-0.49300550871439563, -0.29606645770526813), + complex(-0.88570869397281493, 0.70815560648187492), + complex(-1.1505367129102981, -0.61956726813375551), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(1.1223822468957279, -1.4280988498675686), + complex(-1.8383994720677506, 0.28997438910901774), + complex(3.1041057220284323, -1.6686916883528002), + complex(0.37530693191459574, -0.71825427901572625), + complex(0.34083107036415250, 2.0581299127777353), + complex(0.10214324732675245, -1.9689087625848427), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(-1.3254949515917425, 2.4727583262302915), + complex(0.45003350944482257, 1.6732536514201826), + complex(1.7488524641258163E-003, -2.8067716949413928), + complex(0.27350348103587319, 0.77854507784627458), + complex(-0.44946872904333868, 2.8547206982261146), + complex(2.2531686840963063, -2.1521860590319020), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case9: { + desc: 'trA="t", trB="n" m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k, alpha(0.3,-0.7), beta(0,0)', + input: { + trA: 't', + trB: 'n', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0, 0), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(4.4507797565856517, -5.3868857227079570E-003), + complex(-0.47250256193258577, -1.9973802953111517), + complex(2.6711227288888626, 3.6402504681280075), + complex(0.55609183787047467, -0.67313834735593125), + complex(1.3287459112983664, -1.0268044214142955), + complex(0.52520545506173311, -8.2385543061032240E-002), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-0.47250256193258577, -1.9973802953111517), + complex(-6.3260002675995830, -3.3114588137344145), + complex(-2.2971218930556829, -1.6478996884843982), + complex(-2.0363204443914595, -2.2499564773443321), + complex(0.40061558861965874, 1.6904678157046398), + complex(-5.1403763245064749, -1.6966453912518029), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(2.6711227288888626, 3.6402504681280075), + complex(-2.2971218930556829, -1.6478996884843982), + complex(0.16496875643958009, 3.4495704107117082), + complex(-0.66977407929842148, -0.25169147658342222), + complex(-0.79616179251822528, 0.70011546199184971), + complex(3.1388815049616827, 2.5372598963129320), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(0.55609183787047467, -0.67313834735593125), + complex(-2.0363204443914595, -2.2499564773443321), + complex(-0.66977407929842148, -0.25169147658342222), + complex(-1.0884401916627477, -1.2007128726159602), + complex(-0.87745504234325455, -8.6272420032694280E-002), + complex(-0.56237320460279117, 0.42851227342298820), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(1.3287459112983664, -1.0268044214142955), + complex(0.40061558861965874, 1.6904678157046398), + complex(-0.79616179251822528, 0.70011546199184971), + complex(-0.87745504234325455, -8.6272420032694280E-002), + complex(0.92405775780496646, -1.5362677017759168), + complex(-0.65700831985084540, 1.6425654903335800), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(0.52520545506173311, -8.2385543061032240E-002), + complex(-5.1403763245064749, -1.6966453912518029), + complex(3.1388815049616827, 2.5372598963129320), + complex(-0.56237320460279117, 0.42851227342298820), + complex(-0.65700831985084540, 1.6425654903335800), + complex(0.98630409155989474, -0.24802542871978728), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(3.7847180342745257E-002, -1.8642051328782046), + complex(-2.0245030035789311, 0.52972965958648055), + complex(2.8115061588380978, -1.8217585582236249), + complex(0.12143881318339332, -0.33458992755740996), + complex(5.4336930238428761E-002, 5.4593569150515955E-002), + complex(-0.45232582183330755, -1.1542532438346593), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(-1.6285579195934503, 2.0230172748880868), + complex(0.78647474225188108, 1.7358733205986039), + complex(0.55319801648885369, -1.0543186873557933), + complex(1.1695779801672321, 1.6285987227724297), + complex(-0.56689992736359629, 2.5791589404594841), + complex(2.6582641764756065, -2.2440712754451200), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case10: { + desc: 'trA="n", trB="t" m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k, alpha(0.3,-0.7), beta(1,0)', + input: { + trA: 'n', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(1, 0), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(1.8283689424185956, 6.8457752526828752), + complex(-4.2948968001052625, -2.5025015589473885), + complex(3.5184471989349513, 2.8876146576038475), + complex(1.0362240384267165, -2.3659602996113791), + complex(2.1934113240921658, 3.7161922264642158), + complex(-1.9612249336831489, 2.3171613435073390), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-3.9744306155823055, -3.2395590063808601), + complex(1.4944247452173542, -5.5863482114847942), + complex(-3.5575130404106861, -3.7239465223880606), + complex(1.8411115127185540, 2.5121894432588125), + complex(-0.32092005599940598, 2.1951628098371452), + complex(-0.33137274402718181, 0.28727947961136407), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(2.4408713663295885, 4.0906750461689105), + complex(-5.2130275786988021, -2.9555035339923692), + complex(-0.73795206669616220, 0.39208284126760973), + complex(2.1445134609624761, 0.16521900847121240), + complex(2.8684018438942593, 4.7821867769182322), + complex(-1.0194560751178705, 1.6192798133345434), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-0.29331208291188982, -1.7278851267102249), + complex(3.1437287645915704, 1.3446069090052153), + complex(4.4678213327810186, -1.0255714659436133), + complex(-1.9711965620384884, -2.9636310841360181), + complex(-0.70407409465557558, -2.1317228371315209), + complex(0.31375398462627763, 1.7957050846861771), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(1.3454595542633692, 2.2067017812079825), + complex(0.17726534019505191, 1.4284038836243576), + complex(3.8194204604513811, 4.1830998906463979), + complex(1.7324369450783110, -1.0594157571010796), + complex(1.4554949388239926, 2.8198769011035982), + complex(-2.4847838333500434, -0.42537683269406157), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(1.3366281785376153, 2.1710567096992035), + complex(0.51883491259475101, -1.0253418456430761), + complex(-1.8496357068279230, 0.86333626167495936), + complex(-0.56501547643925309, 1.2587211625622681), + complex(-3.2218412807835151, -0.10491064817110482), + complex(-1.6141820441138848, 0.39205818805249898), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(1.5360272204005236, -5.4663609921080276), + complex(0.93522875414935980, 2.1555781999828931), + complex(-2.7457798461243357, 0.18874990163953620), + complex(1.3724336513755033, 1.1564669591190131), + complex(2.9077878229280349, -0.39242022731738979), + complex(-0.81876403355545324, -2.4195836869565381), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(1.9769249549719594, -2.2964971037134028), + complex(-0.83987549540722273, 3.1105907114368527), + complex(-2.8541797639862589, 5.3046963267592673E-002), + complex(-0.99844894311910282, 1.0045043819556907), + complex(1.4613563705577874, -2.6690315541861764), + complex(0.67848121370666536, 3.2485541199276519E-002), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case11: { + desc: 'trA="n", trB="t" m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k, alpha(0.3,-0.7), beta(0,0)', + input: { + trA: 'n', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0, 0), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(0.56541470734169130, 5.8536148727962471), + complex(-3.9686634429141763, -2.0729884621380013), + complex(2.1886479044632106, 1.6493105194202540), + complex(-0.23620530861155303, -2.0866140123608603), + complex(1.7787698841774622, 1.9582891274041572), + complex(-0.42127492052244336, 1.7564152697844995), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-3.9686634429141763, -2.0729884621380013), + complex(-0.91022856555840259, -4.5207575914438998), + complex(-4.3211064756981621, -2.1601644264789419), + complex(2.6401207762340264, 1.3556523872895743), + complex(0.82673698078190483, 1.3631157050016349), + complex(-4.1911161128088181E-002, 0.51460816751762928), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(2.1886479044632097, 1.6493105194202540), + complex(-4.3211064756981612, -2.1601644264789415), + complex(-1.1736353767280530, 0.44696031617167009), + complex(3.3820519178792852, -8.4922314141550048E-002), + complex(3.0926697289831799, 4.1639434998453257), + complex(-1.3968517348030054, 1.7919033135624716), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-0.23620530861155301, -2.0866140123608599), + complex(2.6401207762340264, 1.3556523872895743), + complex(3.3820519178792852, -8.4922314141549826E-002), + complex(-1.2802427112923338, -2.8478057588853924), + complex(0.58052520954364328, -1.3167541319542138), + complex(0.26702781369899148, 1.5534416036652496), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(1.7787698841774622, 1.9582891274041572), + complex(0.82673698078190483, 1.3631157050016349), + complex(3.0926697289831799, 4.1639434998453257), + complex(0.58052520954364328, -1.3167541319542138), + complex(0.46333455893736541, 1.5569226660266944), + complex(-2.0552707365406562, -9.9143475502975711E-002), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-0.42127492052244325, 1.7564152697844997), + complex(-4.1911161128088251E-002, 0.51460816751762950), + complex(-1.3968517348030054, 1.7919033135624716), + complex(0.26702781369899148, 1.5534416036652496), + complex(-2.0552707365406562, -9.9143475502975614E-002), + complex(-0.54859142407299111, -2.0125951227232579), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(0.70398011556501350, -4.3187039553267166), + complex(1.1625574420556251, 2.4450397828819868), + complex(-3.0119172076508249, 0.48796500979574048), + complex(1.7491363772628019, 1.5679777842761784), + complex(0.46642329617937750, -0.64464368918376858), + complex(-2.3424926042025479E-002, -1.5276625839558975), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(1.3586816778990529, -2.0722292186244822), + complex(-0.66725199517929457, 2.7331950517517178), + complex(-0.63027944584050710, -8.0289401955338235E-002), + complex(0.26516547300333376, 0.20031487876278925), + complex(1.1026274849071527, -2.6119247798858396), + complex(0.68952669199102434, -0.47112244715826745), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case12: { + desc: 'trA="n", trB="t" m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k, alpha(0.3,-0.7), beta(0.2,0.8)', + input: { + trA: 'n', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0.8), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(2.4277242384193973E-002, 7.0624103548475521), + complex(-3.6902996327569393, -2.4198777724218008), + complex(1.4639644420120586, 2.9608108021772419), + complex(0.24175759771871802, -1.1245397778443258), + complex(0.45537567319224587, 2.6415829093298022), + complex(-1.1778617934068787, 0.63660445731402160), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-3.0365604281640981, -2.3109163126664773), + complex(0.42317461249871874, -2.8101530413414797), + complex(-2.9173620909959506, -1.8620460929884759), + complex(1.5550892625873121, 0.94775238159286035), + complex(-6.8432123781824283E-002, 0.61139948534224386), + complex(8.2059474464411697E-002, 0.23757315948895810), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(0.28600094708591139, 2.3393622045456595), + complex(-3.8632194034644978, -3.0327691433849631), + complex(-1.0425967328457988, 0.78453147424657310), + complex(2.9344311617356444, -1.0249248291595738), + complex(2.5532215222686658, 4.1081778463577976), + complex(-1.1832737995010767, 2.0592951452494428), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-0.53460977643870122, -2.0605536542826730), + complex(2.7496787581655631, 1.7563296882892945), + complex(4.3517251367505390, 0.59556339755945142), + complex(-1.3257732219195217, -3.4237339131144400), + complex(0.97558031873242479, -2.5074273340914632), + complex(8.2562260318955846E-002, 1.6392752378902848), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(1.4933776908989083, 1.6613233898085138), + complex(0.64461210705248406, 0.85659602070896579), + complex(3.2226947645734860, 4.7491753719007344), + complex(0.60503685713332156, -0.34375705405706641), + complex(-0.34859676524555194, 2.6032418325427469), + complex(-1.8801866675407091, -0.50800063048114896), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-0.40140745234614589, 3.2456660592070530), + complex(1.3021980841738321, 0.65521502595896530), + complex(-0.74455487797799869, 1.2439627174000840), + complex(0.33639550958738701, 0.82886287253699331), + complex(-2.2839711106626255, -1.0335533593546806), + complex(-2.6854322285431835, -2.3841369621372257), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(1.7885151821179959, -3.8825976723160802), + complex(1.3486609735668056, 2.2052845124045239), + complex(-2.7193176444604905, 0.64103187966656505), + complex(2.0030044959940043, 1.1843134328178624), + complex(0.75291743630510122, 1.3588926544434505), + complex(0.53104414311803450, -2.3423181027060807), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(1.6617446459007608, -1.6224881672822773), + complex(-1.0036932279863531, 2.6705753825732965), + complex(-1.1817286098652349, -1.8327424095409381), + complex(-0.63090902612802524, -0.64973876616336579), + complex(1.2200586832274105, -2.3363630221192091), + complex(0.28443119961172436, -0.37923723074504945), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case13: { + desc: 'trA="c", trB="n",alpha(0.3,-0.7), beta(0.2,0.8), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k, ', + input: { + trA: 'c', + trB: 'n', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0.8), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(1.8196284538355458, -4.2996580157711106), + complex(0.45734796133360955, 2.8388425183224153), + complex(-1.5013115133408128, -0.87751837232925389), + complex(1.8892081183447096, 1.9344024594218006), + complex(-0.79598865149631037, -0.96908403989201441), + complex(0.58906618887295070, -0.85935903128309243), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-1.4982436710722351, 1.8295192701688159), + complex(5.3183765821356861, -7.5876661982521991), + complex(1.1670895062939062, 2.2268025019283249), + complex(-1.6470707251294971, -3.5676640005956148), + complex(-0.49997600812399035, 1.0883817216415144), + complex(2.1952765649333856, -2.6421368220818242), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(0.21811007379003433, -0.25723043573330351), + complex(-0.77553609186819106, 0.62889301912765494), + complex(2.9026993264039649, -6.1296367340227684), + complex(-0.34044501424212709, -2.3621096609325098), + complex(-0.53691941948845623, -3.7235346179717299E-002), + complex(2.6674768453128817, -1.1583386459580689), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-1.9757767624629965, -0.32530470929358923), + complex(2.7852762659006518, -1.3714762599359638), + complex(1.9255606839696517, -0.37788781790985637), + complex(0.83654133978866008, -2.6340956883647433), + complex(-0.26441810770634999, -1.2507483452160089), + complex(2.1424623995832146, -2.6068507436967758E-002), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(0.54742935438160178, -1.8184509856239055), + complex(-1.7871565933077898, 0.47633900148100994), + complex(0.11486254555456127, 0.59618020296347507), + complex(0.52282343457805314, 1.4091155360784073), + complex(-3.2771315599721129E-002, -0.77172075030795217), + complex(-0.26524520459442386, 1.4776512170289295), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-1.0967721074301739, 0.69443423755029332), + complex(1.6282824605005524, -2.9904090194366253), + complex(-7.6215872863775180E-003, -3.3081643013284214), + complex(-1.4543775449277387, -2.4867694780908165), + complex(-1.2911173489954964, 0.68548945818705842), + complex(0.20149107900190577, -5.8276492577923413), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(-1.5406923567757924, -0.46501488646685485), + complex(1.3575059813474573, -1.0568234499978022), + complex(-1.4354008882371929, 0.79073096309137392), + complex(0.19568636296598083, -0.66368940786922326), + complex(-4.8551396509539380E-002, 2.5799940115246076), + complex(-0.45900973107536047, -2.8209087503259562), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(0.80669332169935126, 4.1225608707336638), + complex(-1.2719421237726531, -2.7603847164776596E-002), + complex(-2.4242069127391241, -2.7629718596765369), + complex(-3.3551490492381930, -0.27416575871110116), + complex(-2.6752908806698006E-002, 2.7401980493192077), + complex(-2.5113098663629576, -2.4789891260386558), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case14: { + desc: 'trA="c", trB="n",alpha(0.3,-0.7), beta(0,0), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k, alpha(0.3,-0.7), beta(0,0)', + input: { + trA: 'c', + trB: 'n', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0, 0), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(2.3607659187930432, -5.5084534978224156), + complex(0.17898415117637301, 3.1857318286062148), + complex(-0.77662805088966114, -2.1890186550862420), + complex(1.4112452120144385, 0.97232822490526605), + complex(0.52740555948890600, -1.6523778218176595), + complex(1.3456530617573861, 0.26045178118738532), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-2.4303466858223133, 2.0674471206972922), + complex(3.9849734040785649, -9.2982707483546196), + complex(-0.23665487840830501, 1.9286841684378591), + complex(-0.56203921148278280, -3.1597639948989009), + complex(0.39519309643973899, 1.8400979413009055), + complex(2.0713059293408858, -2.3651018140531530), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(2.1207570311673329, -0.94728212085870922), + complex(-1.2334231641018540, 1.5014977360336765), + complex(2.7716606825217105, -6.4672078920976714), + complex(0.10717574190151363, -1.4221071459144861), + complex(2.5287872260576858E-003, 1.8530307307810853E-002), + complex(2.4538989100109529, -1.4257304776450399), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-1.6773722946358482, -0.35136506737177631), + complex(2.6757182839691147, -1.7721535609356840), + complex(0.95588746509839795, -1.0583735296108576), + complex(0.88207185041584801, -2.0581675341356962), + complex(-0.65947321689513172, -6.0075143078759302E-002), + complex(2.3269279529632501, -0.11190214166200296), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(0.83282154766015570, -1.5214852480282619), + complex(-1.6050317195783690, 0.98285868577367919), + complex(-1.5162490035745159E-002, 1.0948330908065832E-002), + complex(0.49831178698837492, 0.43611845818125994), + complex(0.77916000858319623, -1.8180399168240051), + complex(-0.44032927359437096, 1.8865083720071028), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-1.1166395756064713, -0.79481655187225997), + complex(0.28417321519863181, -3.1310158778779611), + complex(-0.65991844411138423, -2.7602237051660339), + complex(-1.5237452408161343, -1.7621907469625604), + complex(-1.0624169748735268, 1.6198993420387635), + complex(2.3383318834720987, -5.4561074183783731), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(-2.6252274233287749, -0.90112116947749077), + complex(1.1714024498362767, -0.81706817952033939), + complex(-1.7280004514275273, 0.63766409322054929), + complex(-5.8181755765221582E-002, -0.28002505641090703), + complex(-0.33504553663526310, 0.57645766789738850), + complex(-1.0134788002354205, -2.0062532315757728), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(0.50363035369764342, 3.6728198193914592), + complex(-0.93550089096559463, 3.5015822013644726E-002), + complex(-1.8727577487143963, -1.0105188520909372), + complex(-2.4590745501068341, 0.57588788621505393), + complex(-0.14418410712695562, 2.4646362915525772), + complex(-2.1062143739836574, -2.5708743424518739), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case15: { + desc: 'trA="t", trB="t",alpha(0.3,-0.7), beta(0.2,0.8), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k, alpha(0.3,-0.7), beta(0.2,0.8)', + input: { + trA: 't', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0.8), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(3.5385460832679669, 5.0690152586597081), + complex(-0.87403902197839800, -3.7691885022136624), + complex(1.9140254885133325, 4.7636593972279444), + complex(2.5270697488146867, 1.1189451907892667E-002), + complex(0.42910054933443709, 2.0436681273282624), + complex(-6.1181417546944727E-002, -2.7399841207848903), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-2.0130764520945146, -0.84431729406427247), + complex(-0.47069741916643015, -0.58158753995566848), + complex(-0.93722018011335173, 1.8457418203551164), + complex(-1.8048698148425042, -0.14148677317328284), + complex(-0.95027213708358227, 0.29695644985116076), + complex(-3.2087554653423718, -0.50813830199009047), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(-9.1520093991360074E-002, 0.39223048569415409), + complex(-2.3137909119143538, -3.7788826437982230), + complex(2.4847238931676281, 5.9317114443042307), + complex(-0.85921335545086119, -0.62703399022920947), + complex(-0.36310000222884242, -0.42164912145004435), + complex(0.26905532925182346, 1.6041401026677333), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-0.56106771839356728, 0.10023919776376478), + complex(2.3411561306982702, 2.0944517855107119), + complex(3.8190228914582462, -0.57912541336185752), + complex(1.5141289683700436, 0.92641488051832521), + complex(-0.48111489377041072, -0.15029248925437355), + complex(3.5971975359896087, -2.4520385922407382), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(0.59372326212580129, 2.9091162086447957), + complex(2.6024943436570145, -1.7488855939103223), + complex(1.7151081344813948, 1.9041313282185193), + complex(1.4488923316758069, 1.6595226913367753), + complex(-2.6918384958555883, 1.3759187103651978), + complex(5.3544374488064870, 3.6027476784153967E-002), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-0.54038370544818359, 2.6259744913786442), + complex(1.6572061182101778, 0.75084951369151742), + complex(-2.3391983099638334, -0.46825512757162424), + complex(-0.92380985940191085, -1.1350309239414109), + complex(-0.15547308200089907, -1.7314978809001098), + complex(-3.1375194965446105, 2.3072607976361614), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(-2.5928045659138039, -2.5663482933865591), + complex(0.13950376570458456, 1.8101560578598437), + complex(-0.28371278516671494, -1.6963584044946460), + complex(-1.4992215503392261, 0.42407705231309789), + complex(-1.9154880248899508, 0.29214608972165701), + complex(0.58608817660956292, 2.1418437624735391), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(0.26688042031916215, -1.6134463686323126), + complex(-3.7328432388295463, 1.5568438906213706), + complex(-0.70032758917519633, -4.2073084229332203), + complex(-2.6275472719887603, -1.7627577611524732), + complex(0.19085108885961843, -0.11999828389145634), + complex(-2.0306778826051053, 1.0207520805142891), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case16: { + desc: 'trA="t", trB="t",alpha(0.3,-0.7), beta(0,0), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k', + input: { + trA: 't', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0, 0), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(4.0796835482254643, 3.8602197766084032), + complex(-1.1524028321356345, -3.4222991919298629), + complex(2.6387089509644843, 3.4521591144709562), + complex(2.0491068424844157, -0.95088478260864184), + complex(1.7524947603196535, 1.3603743454026174), + complex(0.69540545533749065, -1.6201733083144128), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-2.9451794668445928, -0.60638944353579616), + complex(-1.8041005972235518, -2.2921920900580890), + complex(-2.3409645648155628, 1.5476234868646503), + complex(-0.71983830119578995, 0.26641323252343108), + complex(-5.5103032519852990E-002, 1.0486726695105519), + complex(-3.3327261009348716, -0.23110329396141926), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(1.8111268633859385, -0.29782119943125163), + complex(-2.7716779841480168, -2.9062779268922014), + complex(2.3536852492853737, 5.5941402862293277), + complex(-0.41159259930722053, 0.31296852478881404), + complex(0.17634820448567146, -0.36588346796251620), + complex(5.5477393949894760E-002, 1.3367482709807623), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-0.26266325056641915, 7.4178839685577702E-002), + complex(2.2315981487667331, 1.6937744845109917), + complex(2.8493496725869925, -1.2596111250628588), + complex(1.5596594789972316, 1.5023430347473723), + complex(-0.87617000295919245, 1.0403807128828759), + complex(3.7816630893696441, -2.5378722264657734), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(0.87911545540435521, 3.2060819462404391), + complex(2.7846192173864353, -1.2423659096176531), + complex(1.5850830988910882, 1.3188994561631100), + complex(1.4243806840861286, 0.68652561343962792), + complex(-1.8799071716726710, 0.32959954384914480), + complex(5.1793533798065399, 0.44488463176232718), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-0.56025117362448096, 1.1367237019560910), + complex(0.31309687290825722, 0.61024265525018162), + complex(-2.9914951667888401, 7.9685468590763309E-002), + complex(-0.99317755529030638, -0.41045219281315459), + complex(7.3227292121070431E-002, -0.79708799704840483), + complex(-1.0006786920744175, 2.6788026370501297), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(-3.6773396324667864, -3.0024545763971950), + complex(-4.6599765806595972E-002, 2.0499113283373065), + complex(-0.57631234835704936, -1.8494252743654707), + complex(-1.7530896690704285, 0.80774140377141412), + complex(-2.2019821650156746, -1.7113902539055621), + complex(3.1619107449502915E-002, 2.9564992812237225), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(-3.6182547682545696E-002, -2.0631874199745175), + complex(-3.3964020060224875, 1.6194635597997920), + complex(-0.14887842515046845, -2.4548554153476205), + complex(-1.7314727728574011, -0.91270411622631797), + complex(7.3419890539360835E-002, -0.39556004165808689), + complex(-1.6255823902258053, 0.92886686410107111), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case17: { + desc: 'trA="c", trB="c",alpha(0.3,-0.7), beta(0.2,0.8), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k', + input: { + trA: 'c', + trB: 'c', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0.8), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(-6.1500438761697414, 0.91676218319253766), + complex(3.5513411029856878, -1.8725969124236601), + complex(-5.0443221170537527, 1.7815102541278283), + complex(-0.24664239933464849, -1.1775443933504470), + complex(-3.5171099373794799, 0.35243496558863330), + complex(-6.2947828051592936E-002, -2.7407411539012854), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(3.4023707943114747, 1.4765888004304639), + complex(4.2374737353952749, 1.4362002122560311), + complex(1.8975097219086821, 3.0606261330433640), + complex(-0.78151126190520992, 0.29709548869654701), + complex(-1.6165507017720082, 1.1408477346611656E-002), + complex(2.5897529978319271, 1.9769368947246266), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(-2.9360362770799613, -0.82684794768927894), + complex(4.4739352151447358, -0.86985699563820029), + complex(-5.5431218238369269, 2.4912059417117076), + complex(-0.39039619224796890, -0.42611233745095733), + complex(-0.39611754497192547, -0.43579949771463050), + complex(-0.79267249989422695, 1.1491138643464012), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-0.17097311988904368, 0.26742260661323425), + complex(-2.6560015565570594, -4.7187344885985860E-002), + complex(-8.3263206307371940E-002, -2.2515338359121757), + complex(-2.2090613105721975, -0.66923818675056912), + complex(0.24593109115317413, 0.16129866482933353), + complex(-0.95473933547180612, -4.4028687907513788), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(-3.2133243262466502, 1.2775242924371235), + complex(-1.2029075227147334, -3.3797722006490840), + complex(-1.9182008359011142, 0.34699882394760972), + complex(-1.4549590730581896, 0.41501487580464025), + complex(0.24588078336315844, 2.6349413300718920), + complex(-3.7190414743748983, -3.8526065681799078), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-0.41689721067740748, 2.6788972778560662), + complex(0.68628050565219834, 0.33473851325986215), + complex(2.6576936101864308, 1.6732701026307231), + complex(1.0515417177842015, -0.28845162851873785), + complex(0.29799972291665666, -1.5371523820460204), + complex(-3.3865402735295742, 2.2005376014414648), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(5.7948225854380961, 1.0283492612506000), + complex(-1.2661773065742703, 1.2077212783994682), + complex(2.0292953822177049, -0.70506913362947299), + complex(0.87797921268987078, 1.4428774371591229), + complex(3.0443851104182165, 2.4178061255196392), + complex(-1.6082505673237000, 1.2014128188316171), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(1.8220487762119173, -0.94694560684347517), + complex(0.83318983965261673, 3.5137153210552712), + complex(1.3288795985618007, -3.3376481502499455), + complex(0.95896829926825622, -0.22567957193089871), + complex(0.35323683461731087, -5.0404388901855557E-002), + complex(4.3368007326707647E-002, 1.9096289409433400), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case18: { + desc: 'trA="c", trB="c", alpha(0.3,-0.7), beta(0,0), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k', + input: { + trA: 'c', + trB: 'c', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0, 0), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(-5.6089064112122440, -0.29203329885876728), + complex(3.2729772928284513, -1.5257076021398606), + complex(-4.3196386546026009, 0.47000997137084011), + complex(-0.72460530566491954, -2.1396186278669815), + complex(-2.1937157263942635, -0.33085881633701175), + complex(0.69363904483284244, -1.6209303414308074), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(2.4702677795613965, 1.7145166509589402), + complex(2.9040705573381533, -0.27440433784638940), + complex(0.49376533720647098, 2.7625077995528979), + complex(0.30352025174150443, 0.70499549439326092), + complex(-0.72138159720827888, 0.76312469700600283), + complex(2.4657823622394273, 2.2539719027532978), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(-1.0333893197026627, -1.5168996328146847), + complex(4.0160481429110728, 2.7477212678213014E-003), + complex(-5.6741604677191813, 2.1536347836368046), + complex(5.7224563895671821E-002, 0.51389017756706623), + complex(0.14333066174258841, -0.38003384422710235), + complex(-1.0062504351961556, 0.88172203265943017), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(0.12743134793810451, 0.24136224853504717), + complex(-2.7655595384885965, -0.44786464588570618), + complex(-1.0529364251786257, -2.9320195476131770), + complex(-2.1635307999450095, -9.3310032521522035E-002), + complex(-0.14912401803560760, 1.3519718669665830), + complex(-0.77027378209177044, -4.4887024249764140), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(-2.9279321329680963, 1.5744900300327671), + complex(-1.0207826489853127, -2.8732525163564149), + complex(-2.0482258714914208, -0.23823304810779955), + complex(-1.4794707206478679, -0.55798220209250704), + complex(1.0578121075460758, 1.5886221635558391), + complex(-3.8941255433748454, -3.4437494132017346), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(-0.43676467885370485, 1.1896464884335129), + complex(-0.65782873964972222, 0.19413165481852632), + complex(2.0053967533614241, 2.2212106987931106), + complex(0.98217402189580594, 0.43612710260951848), + complex(0.52670009703862619, -0.60274249819431525), + complex(-1.2496994690593812, 2.5720794408554331), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(4.7102875188851137, 0.59224297823996408), + complex(-1.4522808380854508, 1.4474765488769310), + complex(1.7366958190273707, -0.85813600350029762), + complex(0.62411109395866837, 1.8265417886174391), + complex(2.7578909702924927, 0.41426978189242025), + complex(-2.1627196364837600, 2.0160683375818005), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(1.5189858082102095, -1.3966866581856801), + complex(1.1696310724596752, 3.5763349902336925), + complex(1.8803287625865286, -1.5851951426643458), + complex(1.8550427983996152, 0.62437407299525638), + complex(0.23580563629705326, -0.32596614666848611), + complex(0.44846349970600774, 1.8177437245301220), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case19: { + desc: 'trA="c", trB="t", alpha(0.3,-0.7), beta(0.2,0.8), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k', + input: { + trA: 'c', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0.8), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(3.9662382698970875, -2.0530064297387383), + complex(-0.16566178800321951, 2.0315047686864234), + complex(-0.38620288809997882, -1.7003378831363722), + complex(1.0340649521920033, 2.6346015263248330), + complex(0.18984068857561254, 1.4284340848302317), + complex(-0.60133781234231343, -2.6983092383997600), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(1.0590944192764742, 2.0470223780157060), + complex(1.5362309226730355, -4.4733378729943656), + complex(2.5143241756448425, 3.5904641914052320), + complex(-2.3324965747943232, -1.3736732601341644), + complex(-1.3307325220258206, 0.45595976858170939), + complex(2.5359736395518007, -1.6995204331579026), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(-0.55312120765047212, -3.2774338977239088), + complex(-0.27517960515425433, -1.6121287859899063), + complex(0.86383317637964707, -1.4488731831572050), + complex(-0.39220337059255928, -1.4577285139278198), + complex(-1.3207898487439298, -0.76977502554621102), + complex(4.1076176331932643, -2.1361187125788117), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-1.1928338144108308, 0.54503279437246466), + complex(0.77774079187475498, 3.7968497481497998), + complex(-2.2595258003240897, -0.45900484904412320), + complex(-1.0799521591340557, 0.36958292441776330), + complex(-0.57982293514072381, -0.16127684822808552), + complex(-2.0149239521336999, -1.3855612887492010), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(0.64206533777186903, -1.0141299132555142), + complex(0.24854602982260321, 5.2739185823623771), + complex(1.4879302282060944, -3.8144873772657073), + complex(0.79981737000314257, 1.1588526278722129), + complex(-2.0864424504400287, 1.1496178729667861), + complex(1.2861047516169348, -0.23881163545053613), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(1.0121300475780082, 2.6739608948819784), + complex(-0.45615820581901767, -0.38393120350382026), + complex(3.5864532049429783, -0.61303315416867354), + complex(0.55247173780875525, -1.0624276583543844), + complex(0.48968426694509803, -1.7590733075657838), + complex(-1.9548632943877771, 1.7013820419892762), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(-3.5578500664407011, 1.8577791355219724), + complex(9.4625880057405298E-002, -1.6462026294281489), + complex(1.7187570531033243, 1.7329235942744154), + complex(0.35483128904400951, -2.2474189916985101), + complex(-1.7865225219801513, 1.1833396357063339), + complex(1.6885936017695036, -0.51345297285159130), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(-2.5760846495535086, 1.0304177824689875), + complex(7.4317551938250181E-002, -3.0610822497096288), + complex(-0.84180371271215515, -1.6648453774686487), + complex(-1.0037348754404496, -2.4785837715562491), + complex(0.40819071243113431, 0.24047741225782382), + complex(-1.1449782488550009, -0.75494916857884609), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case20: { + desc: 'trA="c", trB="t", alpha(0.3,-0.7), beta(0,0), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k', + input: { + trA: 'c', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0, 0), + alpha: complex(0.3, -0.7), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(4.5073757348545849, -3.2618019117900432), + complex(-0.44402559816045606, 2.3783940789702229), + complex(0.33848057435117296, -3.0118381658933604), + complex(0.55610204586173217, 1.6725272918082985), + complex(1.5132348995608289, 0.74514030290458666), + complex(0.15524906054212201, -1.5784984259292822), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(0.12699140452639590, 2.2849502285441825), + complex(0.20282774461591391, -6.1839424230967861), + complex(1.1105797909426314, 3.2923458579147660), + complex(-1.2474650611476088, -0.96577325443745043), + complex(-0.43556341746209132, 1.2076759882411006), + complex(2.4120030039593008, -1.4224854251292314), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(1.3495257497268265, -3.9674855828493145), + complex(-0.73306667738791731, -0.73952406908388457), + complex(0.73279453249739268, -1.7864443412321078), + complex(5.5417385551081444E-002, -0.51772599890979609), + complex(-0.78134164202941592, -0.71400937205868287), + complex(3.8940396978913352, -2.4035105442657825), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-0.89442934658368256, 0.51897243629427758), + complex(0.66818280994321788, 3.3961724471500796), + complex(-3.2291990191953435, -1.1394905607451244), + complex(-1.0344216485068678, 0.94551107864681039), + complex(-0.97487804432950553, 1.0293963539091640), + complex(-1.8304583987536645, -1.4713949229742362), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(0.92745753105042295, -0.71716417565987056), + complex(0.43067090355202398, 5.7804382666550467), + complex(1.3579051926157879, -4.3997192493211168), + complex(0.77530572241346429, 0.18585554997506562), + complex(-1.2745111262571114, 0.10329870645073308), + complex(1.1110206826169877, 0.17004551952763708), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(0.99226257940171081, 1.1847101054594251), + complex(-1.8002674511209382, -0.52453806194515606), + complex(2.9341563481179715, -6.5092558006285994E-002), + complex(0.48310404192035972, -0.33784892722612803), + complex(0.71838464106706756, -0.82466342371407875), + complex(0.18197751008241592, 2.0729238814032445), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(-4.6423851329936836, 1.4216728525113365), + complex(-9.1477651453775233E-002, -1.4064473589506861), + complex(1.4261574899129899, 1.5798567244035908), + complex(0.10096317031280710, -1.8637546402401939), + complex(-2.0730166621058750, -0.82019670792088517), + complex(1.1341245326094436, 0.30120254589859213), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(-2.8791476175552164, 0.58067673112678264), + complex(0.41075878474530869, -2.9984625805312075), + complex(-0.29035454868742722, 8.7607630116951093E-002), + complex(-0.10766037630909076, -1.6285301266300940), + complex(0.29075951411087669, -3.5084345508806722E-002), + complex(-0.73988275647570079, -0.84683438499206409), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case21: { + desc: 'trA="c", trB="t", alpha(0,0), beta(1,0), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k', + input: { + trA: 'c', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(1, 0), + alpha: complex(0, 0), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(1.2629542350769043, 0.99216037988662720), + complex(-0.32623335719108582, -0.42951309680938721), + complex(1.3297992944717407, 1.2383041381835938), + complex(1.2724293470382690, -0.27934628725051880), + complex(0.41464143991470337, 1.7579030990600586), + complex(-1.5399500131607056, 0.56074607372283936), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-5.7671726681292057E-003, -1.1665705442428589), + complex(2.4046533107757568, -1.0655906200408936), + complex(0.76359343528747559, -1.5637820959091187), + complex(-0.79900926351547241, 1.1565370559692383), + complex(-1.1476570367813110, 0.83204710483551025), + complex(-0.28946158289909363, -0.22732868790626526), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(0.25222346186637878, 2.4413645267486572), + complex(-0.89192110300064087, -0.79533910751342773), + complex(0.43568331003189087, -5.4877474904060364E-002), + complex(-1.2375384569168091, 0.25014132261276245), + complex(-0.22426788508892059, 0.61824327707290649), + complex(0.37739565968513489, -0.17262350022792816), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-5.7106774300336838E-002, 0.35872888565063477), + complex(0.50360798835754395, -1.1045478284358978E-002), + complex(1.0857694149017334, -0.94064915180206299), + complex(-0.69095385074615479, -0.11582532525062561), + complex(-1.2845993041992188, -0.81496870517730713), + complex(4.6726170927286148E-002, 0.24226348102092743), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(-0.43331032991409302, 0.24841265380382538), + complex(-0.64947164058685303, 6.5288178622722626E-002), + complex(0.72675073146820068, 1.9156390801072121E-002), + complex(1.1519117355346680, 0.25733837485313416), + complex(0.99216037988662720, 1.2629542350769043), + complex(-0.42951309680938721, -0.32623335719108582), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(1.7579030990600586, 0.41464143991470337), + complex(0.56074607372283936, -1.5399500131607056), + complex(-0.45278397202491760, -0.92856705188751221), + complex(-0.83204329013824463, -0.29472044110298157), + complex(-1.1665705442428589, -5.7671726681292057E-003), + complex(-1.0655906200408936, 2.4046533107757568), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(0.83204710483551025, -1.1476570367813110), + complex(-0.22732868790626526, -0.28946158289909363), + complex(0.26613736152648926, -0.29921510815620422), + complex(-0.37670272588729858, -0.41151082515716553), + complex(2.4413645267486572, 0.25222346186637878), + complex(-0.79533910751342773, -0.89192110300064087), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(0.61824327707290649, -0.22426788508892059), + complex(-0.17262350022792816, 0.37739565968513489), + complex(-2.2239003181457520, 0.13333636522293091), + complex(-1.2636144161224365, 0.80418950319290161), + complex(0.35872888565063477, -5.7106774300336838E-002), + complex(-1.1045478284358978E-002, 0.50360798835754395), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case22: { + desc: 'trA="c", trB="t", alpha(0,0), beta(0.2,0.2), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k', + input: { + trA: 'c', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0.2), + alpha: complex(0, 0), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(5.4158771845083997E-002, 0.45102292971347158), + complex(2.0655948231457888E-002, -0.15114929305239455), + complex(1.8299031530306209E-002, 0.51362069418461154), + complex(0.31035513148240934, 0.19861661491716820), + complex(-0.26865233583230275, 0.43450891426963967), + complex(-0.42013922363727119, -0.19584079080582839), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(0.23216067777440957, -0.23446754687603627), + complex(0.69404879650546292, 0.26781254213769046), + complex(0.46547511317543844, -0.16003773450907666), + complex(-0.39110926972492432, 7.1505559556269027E-002), + complex(-0.39594083422334236, -6.3121987329751050E-002), + complex(-1.2426579183736131E-002, -0.10335805570122680), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(-0.43782821950060447, 0.53871760575052496), + complex(-1.9316399385279404E-002, -0.33745204713124100), + complex(9.8112158449175313E-002, 7.6161168160455928E-002), + complex(-0.29753596033954555, -0.19747942980348210), + complex(-0.16850223494324434, 7.8795079570935345E-002), + complex(0.11000383362179744, 4.0954432501709936E-002), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-8.3167133229481160E-002, 6.0324423168963526E-002), + complex(0.10293069486216744, 9.8512503482587666E-002), + complex(0.40528371937995722, 2.9024053052426169E-002), + complex(-0.11502570681312241, -0.16135583760374539), + complex(-9.3926121203990576E-002, -0.41991360813250544), + complex(-3.9107462601474852E-002, 5.7797931250898993E-002), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(-0.13634459877527649, -3.6979535773091543E-002), + complex(-0.14295196597206539, -0.11683669413382847), + complex(0.14151887024222118, 0.14918142667683101), + complex(0.17891467480234313, 0.28185002627745304), + complex(-5.4158771845083997E-002, 0.45102292971347158), + complex(-2.0655948231457888E-002, -0.15114929305239455), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(0.26865233583230275, 0.43450891426963967), + complex(0.42013922363727119, -0.19584079080582839), + complex(9.5156617390462994E-002, -0.27627020889923282), + complex(-0.10746457140839949, -0.22535274960626284), + complex(-0.23216067777440957, -0.23446754687603627), + complex(-0.69404879650546292, 0.26781254213769046), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(0.39594083422334236, -6.3121987329751050E-002), + complex(1.2426579183736131E-002, -0.10335805570122680), + complex(0.11307049562142035, -6.6155494245223601E-003), + complex(6.9616199577096083E-003, -0.15764271255795226), + complex(0.43782821950060447, 0.53871760575052496), + complex(1.9316399385279404E-002, -0.33745204713124100), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(0.16850223494324434, 7.8795079570935345E-002), + complex(-0.11000383362179744, 4.0954432501709936E-002), + complex(-0.47144734369884933, -0.41811279681493030), + complex(-0.41356079002560353, -9.1884983955099919E-002), + complex(8.3167133229481160E-002, 6.0324423168963526E-002), + complex(-0.10293069486216744, 9.8512503482587666E-002), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case23: { + desc: 'trA="c", trB="t", alpha(0,0), beta(0,0) m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k', + input: { + trA: 'c', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0, 0), + alpha: complex(0, 0), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(0.0000000000000000, 0.0000000000000000), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + case24: { + desc: 'trA="c", trB="t", alpha(0,0), beta(0.2,0), m_a=m_c=m=6, n_b=n_c=n=8, n_a=m_b=k,', + input: { + trA: 'c', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0), + alpha: complex(0, 0), + //bandmatrix_mxn_ku_kl(n = 6, m = 6, lda = m, kl = 3, ku = 2) + a: matrix_mxn(8, 8), + b: matrix_mxn(8, 8), + c: matrix_mxn(8, 8), + }, + expect: { + c: [ + complex(0.25259085077927779, 0.19843207893419379), + complex(-6.5246672410468332E-002, -8.5902620641926219E-002), + complex(0.26595986285745887, 0.24766083132715266), + complex(0.25448587319978877, -5.5869258282620571E-002), + complex(8.2928289218668461E-002, 0.35158062505097121), + complex(-0.30799000722154979, 0.11214921641572140), + complex(-0.92856705188751221, -0.45278397202491760), + complex(-0.29472044110298157, -0.83204329013824463), + complex(-1.1534345508133551E-003, -0.23331411232522292), + complex(0.48093066932157669, -0.21311812718388623), + complex(0.15271868933318089, -0.31275642384225755), + complex(-0.15980185508432765, 0.23130741464059668), + complex(-0.22953141077654671, 0.16640942344679566), + complex(-5.7892317442481467E-002, -4.5465738258745336E-002), + complex(-0.29921510815620422, 0.26613736152648926), + complex(-0.41151082515716553, -0.37670272588729858), + complex(5.0444693124960249E-002, 0.48827291262556471), + complex(-0.17838422325826020, -0.15906782387298080), + complex(8.7136663304815620E-002, -1.0975495144359693E-002), + complex(-0.24750769507151382, 5.0028265268031724E-002), + complex(-4.4853577686154500E-002, 0.12364865725708984), + complex(7.5479133061753689E-002, -3.4524700560043753E-002), + complex(0.13333636522293091, -2.2239003181457520), + complex(0.80418950319290161, -1.2636144161224365), + complex(-1.1421355030258817E-002, 7.1745778199222343E-002), + complex(0.10072159917237755, -2.2090956897898861E-003), + complex(0.21715388621619169, -0.18812983316376553), + complex(-0.13819077220843390, -2.3165065395311490E-002), + complex(-0.25691986466824801, -0.16299374346425743), + complex(9.3452343247120706E-003, 4.8452696926186922E-002), + complex(-0.23570655286312103, -1.4250984191894531), + complex(-0.54288828372955322, 0.36594113707542419), + complex(-8.6662067274184018E-002, 4.9682531501092475E-002), + complex(-0.12989433005294693, 1.3057635919118460E-002), + complex(0.14535014845952610, 3.8312782173049176E-003), + complex(0.23038235053989808, 5.1467675737554952E-002), + complex(0.19843207893419379, 0.25259085077927779), + complex(-8.5902620641926219E-002, -6.5246672410468332E-002), + complex(1.2383041381835938, 1.3297992944717407), + complex(-0.27934628725051880, 1.2724293470382690), + complex(0.35158062505097121, 8.2928289218668461E-002), + complex(0.11214921641572140, -0.30799000722154979), + complex(-9.0556795754384911E-002, -0.18571341314484791), + complex(-0.16640866050733116, -5.8944089098931673E-002), + complex(-0.23331411232522292, -1.1534345508133551E-003), + complex(-0.21311812718388623, 0.48093066932157669), + complex(-1.5637820959091187, 0.76359343528747559), + complex(1.1565370559692383, -0.79900926351547241), + complex(0.16640942344679566, -0.22953141077654671), + complex(-4.5465738258745336E-002, -5.7892317442481467E-002), + complex(5.3227473098448996E-002, -5.9843022522971356E-002), + complex(-7.5340546300121325E-002, -8.2302166257830933E-002), + complex(0.48827291262556471, 5.0444693124960249E-002), + complex(-0.15906782387298080, -0.17838422325826020), + complex(-5.4877474904060364E-002, 0.43568331003189087), + complex(0.25014132261276245, -1.2375384569168091), + complex(0.12364865725708984, -4.4853577686154500E-002), + complex(-3.4524700560043753E-002, 7.5479133061753689E-002), + complex(-0.44478007025688981, 2.6667273441959516E-002), + complex(-0.25272288699035172, 0.16083790303525181), + complex(7.1745778199222343E-002, -1.1421355030258817E-002), + complex(-2.2090956897898861E-003, 0.10072159917237755), + complex(-0.94064915180206299, 1.0857694149017334), + complex(-0.11582532525062561, -0.69095385074615479), + ] + }, + }, + }, + dgemmErrors: { + case3: { + desc: 'transA!="ntc"', + input: { + trA: 'x', + trB: 't', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0), + alpha: complex(0, 0), + a: [complex(0, 0)], + b: [complex(0, 0)], + c: [complex(0, 0)], + } + }, + case4: { + desc: 'transB!="ntc"', + input: { + trA: 'c', + trB: 'x', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0), + alpha: complex(0, 0), + a: [complex(0, 0)], + b: [complex(0, 0)], + c: [complex(0, 0)], + } + }, + case5: { + desc: 'n<0"', + input: { + trA: 'c', + trB: 'c', + m: 6, // A(M,K), C(M,N) + n: -8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0), + alpha: complex(0, 0), + a: [complex(0, 0)], + b: [complex(0, 0)], + c: [complex(0, 0)], + } + }, + case6: { + desc: 'k<0', + input: { + trA: 'c', + trB: 'c', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: -4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0), + alpha: complex(0, 0), + a: [complex(0, 0)], + b: [complex(0, 0)], + c: [complex(0, 0)], + } + }, + case7: { + desc: 'k<0', + input: { + trA: 'c', + trB: 'c', + m: -6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0), + alpha: complex(0, 0), + a: [complex(0, 0)], + b: [complex(0, 0)], + c: [complex(0, 0)], + } + }, + case8: { + desc: 'lda< max(1,nrowA)', + input: { + trA: 'n', + trB: 'n', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 4, // lda >= M + ldb: 8, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0), + alpha: complex(0, 0), + a: [complex(0, 0)], + b: [complex(0, 0)], + c: [complex(0, 0)], + } + }, + case9: { + desc: 'ldb< max(1,nrowB)', + input: { + trA: 'n', + trB: 'n', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 3, // ldb >= K + ldc: 8, // ldc >= M + beta: complex(0.2, 0), + alpha: complex(0, 0), + a: [complex(0, 0)], + b: [complex(0, 0)], + c: [complex(0, 0)], + } + }, + case10: { + desc: 'ldc< max(1,nrowC)', + input: { + trA: 'n', + trB: 'n', + m: 6, // A(M,K), C(M,N) + n: 8, // B(K,N), A(M,K) + k: 4, + lda: 8, // lda >= M + ldb: 8, // ldb >= K + ldc: 5, // ldc >= M + beta: complex(0.2, 0), + alpha: complex(0, 0), + a: [complex(0, 0)], + b: [complex(0, 0)], + c: [complex(0, 0)], + } + }, + }, +} + diff --git a/test/level3/double/dgemm/test.ts b/test/level3/double/dgemm/test.ts new file mode 100644 index 0000000..4fd2cfe --- /dev/null +++ b/test/level3/double/dgemm/test.ts @@ -0,0 +1,104 @@ +import { assert, expect } from 'chai'; +import * as blas from '../../../../src/lib'; +import { Matrix, real } from '../../../../src/lib/f_func'; +import { + approximately, + approximatelyWithPrec +} from '../../../test-helpers'; +import { fixture } from './fixtures'; + +const { + util: { + arrayrify, + numberPrecision, + each, + multiplexer, + fortranArrComplex64, + fortranMatrixComplex64, + complex, + muxCmplx + }, + level3: { + dgemm + } +} = blas; + +const { abs } = Math; +const { isNaN, isFinite } = Number; + +describe('blas level 3 single/double complex', function n() { + + describe('dgemm', () => { + + describe('data tests', () => { + const { dgemm: testData } = fixture; + each(testData)(({ + input: { + cmd, + trA, + trB, + m, // A(M,K), C(M,N) + n, // B(K,N), A(M,K) + k, + lda, // lda >= M + ldb, // ldb >= K + ldc, // ldc >= M + beta, + alpha, + //bandmatrix_nxm_ku_kl(n = 6, m = 6, lda = m, kl = 4, ku = 4) + a, + b, + c + }, expect, desc + }, key) => { + it(`[${key}]/[${desc}]`, function t() { + dgemm(trA, trB, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc); + if (cmd === 'debug') { + console.log(`c actual:\n ${c.toArr().join(',\n')}\n\n`); + console.log(`c expected:\n${(>real(expect.c)).join(',\n')}`); + const r = real(expect.c); + const d = c.toArr().map((v, i) => v - r[i]); + console.log(d); + + } + const approx = approximatelyWithPrec(1E-5); + multiplexer(c.toArr(), real(expect.c))(approx); + }); + }); + }); + + describe.skip('test errors', () => { + const { dgemmErrors: errors } = fixture; + each(errors)(({ input: { + trA, + trB, + m, // A(M,K), C(M,N) + n, // B(K,N), A(M,K) + k, + lda, // lda >= M + ldb, // ldb >= K + ldc, // ldc >= M + beta, + alpha, + //bandmatrix_nxm_ku_kl(n = 6, m = 6, lda = m, kl = 4, ku = 4) + a, + b, + c + }, desc }, key) => { + it(`[${key}]/[${desc}]`, function t() { + + const aM = fortranMatrixComplex64(a)(1, 1).real(); + const bM = fortranMatrixComplex64(b)(1, 1).real(); + const cM = fortranMatrixComplex64(c)(1, 1).real(); + + //console.log(` a:${aM.r},${aM.i}, x=${JSON.stringify(sx)}`); + + + const call = () => dgemm(trA, trB, m, n, k, alpha, aM, lda, bM, ldb, beta, cM, ldc); + //call() + expect(call).to.throw(); + }); + }); + }); + }); +}); diff --git a/test/test-helpers.ts b/test/test-helpers.ts index 3e1ba36..a570e5e 100644 --- a/test/test-helpers.ts +++ b/test/test-helpers.ts @@ -25,6 +25,7 @@ export function approximately(act: number | Complex, exp: number | Complex, prec assert.isNaN(exp); break; case isFinite(act): + //console.log(act, exp, prec); assert.approximately(act, exp, prec, 'numbers are NOT close'); break; case !isFinite(act): diff --git a/tsconfig.json b/tsconfig.json index 12b6f30..b0c11fb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "strictPropertyInitialization": false, + "strictPropertyInitialization": false, "noImplicitAny": false, "noLib": false, "noUnusedLocals": true, @@ -23,7 +23,7 @@ "target": "es2016", "moduleResolution": "node", "outDir": "dist", - "rootDir": "./", + "rootDir": "", "sourceMap": true, "strict": true },