Hello,
This mail is about an old discussion in the list about testing input
parameters in gsl cblas implementation:
http://lists.gnu.org/archive/html/help-gsl/2009-06/msg00020.html
http://lists.gnu.org/archive/html/help-gsl/2009-07/msg00000.html

Attached send I a file with the macros for doing the checks. Brian (or
other), please, give me your opinion about the method for checking the
input parameters as we discussed in the previous mails.

Thanks

-- 
*****************************************
José Luis García Pallero
[email protected]
(o<
/ / \
V_/_
Use Debian GNU/Linux and enjoy!
*****************************************
/* This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#ifndef _ERROR_CBLAS_H_
#define _ERROR_CBLAS_H_
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_MAX(a,b) ((a)>(b) ? (a) : (b))
////////////////////////////////////////////////////////////////////////////////
#define CHECK_ORDER(pos,posIfError,order) \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) \
    pos = posIfError;
////////////////////////////////////////////////////////////////////////////////
#define CHECK_TRANSPOSE(pos,posIfError,Trans) \
if(((Trans)!=CblasNoTrans)&&((Trans)!=CblasTrans)&&((Trans)!=CblasConjTrans)) \
    pos = posIfError;
////////////////////////////////////////////////////////////////////////////////
#define CHECK_UPLO(pos,posIfError,Uplo) \
if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) \
    pos = posIfError;
////////////////////////////////////////////////////////////////////////////////
#define CHECK_DIAG(pos,posIfError,Diag) \
if(((Diag)!=CblasNonUnit)&&((Diag)!=CblasUnit)) \
    pos = posIfError;
////////////////////////////////////////////////////////////////////////////////
#define CHECK_SIDE(pos,posIfError,Side) \
if(((Side)!=CblasLeft)&&((Side)!=CblasRight)) \
    pos = posIfError;
////////////////////////////////////////////////////////////////////////////////
#define CHECK_DIM(pos,posIfError,dim) \
if((dim)<0) \
    pos = posIfError;
////////////////////////////////////////////////////////////////////////////////
#define CHECK_STRIDE(pos,posIfError,stride) \
if((stride)==0) \
    pos = posIfError;
////////////////////////////////////////////////////////////////////////////////
/*
 * =============================================================================
 * Prototypes for level 2 BLAS
 * =============================================================================
 */

/*
 * Routines with standard 4 prefixes (S, D, C, Z)
 */
#define CBLAS_ERROR_GEMV(pos,order,TransA,M,N,alpha,A,lda,X,incX,beta,Y,incY) \
CHECK_ORDER(pos,1,order); \
CHECK_TRANSPOSE(pos,2,TransA); \
CHECK_DIM(pos,3,M); \
CHECK_DIM(pos,4,N); \
if((order)==CblasRowMajor) { \
    if((lda)<CBLAS_MAX(1,N)) { \
        pos = 7; \
    } \
} else if((order)==CblasColMajor) { \
    if((lda)<CBLAS_MAX(1,M)) { \
        pos = 7; \
    } \
} \
CHECK_STRIDE(pos,9,incX); \
CHECK_STRIDE(pos,12,incY);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_GBMV(pos,order,TransA,M,N,KL,KU,alpha,A,lda,X,incX,beta,Y,incY) \
CHECK_ORDER(pos,1,order); \
CHECK_TRANSPOSE(pos,2,TransA); \
CHECK_DIM(pos,3,M); \
CHECK_DIM(pos,4,N); \
CHECK_DIM(pos,5,KL); \
CHECK_DIM(pos,6,KU); \
if((order)==CblasRowMajor) { \
    if((lda)<CBLAS_MAX(1,N) { \
        pos = 9; \
    } \
} else if((order)==CblasColMajor) { \
    if((lda)<CBLAS_MAX(1,(KL+KU+1))) { \
        pos = 9; \
    } \
} \
CHECK_STRIDE(pos,11,incX); \
CHECK_STRIDE(pos,14,incY);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TRMV(pos,order,Uplo,TransA,Diag,N,A,lda,X,incX) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_TRANSPOSE(pos,3,TransA); \
CHECK_DIAG(pos,4,Diag); \
CHECK_DIM(pos,5,N); \
if((lda)<CBLAS_MAX(1,N)) \
    pos = 7; \
CHECK_STRIDE(pos,9,incX);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TBMV(pos,order,Uplo,TransA,Diag,N,K,A,lda,X,incX) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_TRANSPOSE(pos,3,TransA); \
CHECK_DIAG(pos,4,Diag); \
CHECK_DIM(pos,5,N); \
CHECK_DIM(pos,6,K); \
if((order)==CblasRowMajor) { \
    if((lda)<CBLAS_MAX(1,N)) { \
        pos = 8; \
    } \
} else if((order)==CblasColMajor) { \
    if((lda)<CBLAS_MAX(1,(K+1))) { \
        pos = 8; \
    } \
} \
CHECK_STRIDE(pos,10,incX);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TPMV(pos,order,Uplo,TransA,Diag,N,Ap,X,incX) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_TRANSPOSE(pos,3,TransA); \
CHECK_DIAG(pos,4,Diag); \
CHECK_DIM(pos,5,N); \
CHECK_STRIDE(pos,8,incX);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TRSV(pos,order,Uplo,TransA,Diag,N,A,lda,X,incX) \
CBLAS_ERROR_TRMV(pos,order,Uplo,TransA,Diag,N,A,lda,X,incX)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TBSV(pos,order,Uplo,TransA,Diag,N,K,A,lda,X,incX) \
CBLAS_ERROR_TBMV(pos,order,Uplo,TransA,Diag,N,K,A,lda,X,incX)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TPSV(pos,order,Uplo,TransA,Diag,N,Ap,X,incX) \
CBLAS_ERROR_TPMV(pos,order,Uplo,TransA,Diag,N,Ap,X,incX)
////////////////////////////////////////////////////////////////////////////////
/*
 * Routines with S and D prefixes only
 */

#define CBLAS_ERROR_SD_SYMV(pos,order,Uplo,N,alpha,A,lda,X,incX,beta,Y,incY) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_DIM(pos,3,N); \
if((lda)<CBLAS_MAX(1,N)) { \
    pos = 6; \
CHECK_STRIDE(pos,8,incX); \
CHECK_STRIDE(pos,11,incY);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SBMV(pos,order,Uplo,N,K,alpha,A,lda,X,incX,beta,Y,incY) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_DIM(pos,3,N); \
CHECK_DIM(pos,4,K); \
if((order)==CblasRowMajor) { \
    if((lda)<CBLAS_MAX(1,N)) { \
        pos = 7; \
    } \
} else if((order)==CblasColMajor) { \
    if((lda)<CBLAS_MAX(1,K+1)) { \
        pos = 7; \
    } \
} \
CHECK_STRIDE(pos,9,incX); \
CHECK_STRIDE(pos,12,incY);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SPMV(pos,order,Uplo,N,alpha,Ap,X,incX,beta,Y,incY) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_DIM(pos,3,N); \
CHECK_STRIDE(pos,7,incX); \
CHECK_STRIDE(pos,10,incY);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_GER(pos,order,M,N,alpha,X,incX,Y,incY,A,lda) \
CHECK_ORDER(pos,1,order); \
CHECK_DIM(pos,2,M); \
CHECK_DIM(pos,3,N); \
CHECK_STRIDE(pos,6,incX); \
CHECK_STRIDE(pos,8,incY); \
if((order)==CblasRowMajor) { \
    if((lda)<CBLAS_MAX(1,N)) { \
        pos = 10; \
    } \
} else if((order)==CblasColMajor) { \
    if((lda)<CBLAS_MAX(1,M)) { \
        pos = 10; \
    } \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SYR(pos,order,Uplo,N,alpha,X,incX,A,lda) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_DIM(pos,3,N); \
CHECK_STRIDE(pos,6,incX); \
if((lda)<CBLAS_MAX(1,N)) { \
    pos = 8; \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SPR(pos,order,Uplo,N,alpha,X,incX,Ap) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_DIM(pos,3,N); \
CHECK_STRIDE(pos,6,incX);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SYR2(pos,order,Uplo,N,alpha,X,incX,Y,incY,A,lda) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_DIM(pos,3,N); \
CHECK_STRIDE(pos,6,incX); \
CHECK_STRIDE(pos,8,incY); \
if((lda)<CBLAS_MAX(1,N)) { \
    pos = 10; \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SPR2(pos,order,Uplo,N,alpha,X,incX,Y,incY,A) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_DIM(pos,3,N); \
CHECK_STRIDE(pos,6,incX); \
CHECK_STRIDE(pos,8,incY);
////////////////////////////////////////////////////////////////////////////////
/*
 * Routines with C and Z prefixes only
 */

#define CBLAS_ERROR_CZ_HEMV(pos,order,Uplo,N,alpha,A,lda,X,incX,beta,Y,incY) \
CBLAS_ERROR_SD_SYMV(pos,order,Uplo,N,alpha,A,lda,X,incX,beta,Y,incY)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HBMV(pos,order,Uplo,N,K,alpha,A,lda,X,incX,beta,Y,incY) \
CBLAS_ERROR_SD_SBMV(pos,order,Uplo,N,K,alpha,A,lda,X,incX,beta,Y,incY)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HPMV(pos,order,Uplo,N,alpha,Ap,X,incX,beta,Y,incY) \
CBLAS_ERROR_SD_SPMV(pos,order,Uplo,N,alpha,Ap,X,incX,beta,Y,incY)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_GERU(pos,order,M,N,alpha,X,incX,Y,incY,A,lda) \
CBLAS_ERROR_SD_GER(pos,order,M,N,alpha,X,incX,Y,incY,A,lda)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_GERC(pos,order,M,N,alpha,X,incX,Y,incY,A,lda) \
CBLAS_ERROR_SD_GER(pos,order,M,N,alpha,X,incX,Y,incY,A,lda)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_CHER(pos,order,Uplo,N,alpha,X,incX,A,lda) \
CBLAS_ERROR_SD_SYR(pos,order,Uplo,N,alpha,X,incX,A,lda)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HPR(pos,order,Uplo,N,alpha,X,incX,A) \
CBLAS_ERROR_SD_SPR(pos,order,Uplo,N,alpha,X,incX,A)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HER2(pos,order,Uplo,N,alpha,X,incX,Y,incY,A,lda) \
CBLAS_ERROR_SD_SYR2(pos,order,Uplo,N,alpha,X,incX,Y,incY,A,lda)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HPR2(pos,order,Uplo,N,alpha,X,incX,Y,incY,Ap) \
CBLAS_ERROR_SD_SPR2(pos,order,Uplo,N,alpha,X,incX,Y,incY,Ap)
////////////////////////////////////////////////////////////////////////////////
/*
 * ===========================================================================
 * Prototypes for level 3 BLAS
 * ===========================================================================
 */

/*
 * Routines with standard 4 prefixes (S, D, C, Z)
 */

#define CBLAS_ERROR_GEMM(pos,Order,TransA,TransB,M,N,K,alpha,A,lda,B,ldb,beta,C,ldc) \
{ \
    int __trasF=0,__trasG=0; \
    if((order)==CblasRowMajor) { \
        __trasF = ((TransA)!=CblasConjTrans) ? TransA : CblasTrans; \
        __trasG = ((TransB)!=CblasConjTrans) ? TransB : CblasTrans; \
    } else { \
        __trasF = ((TransB)!=CblasConjTrans) ? TransB : CblasTrans; \
        __trasG = ((TransA)!=CblasConjTrans) ? TransA : CblasTrans; \
    } \
    CHECK_ORDER(pos,1,Order); \
    CHECK_TRANSPOSE(pos,2,TransA); \
    CHECK_TRANSPOSE(pos,3,TransB); \
    CHECK_DIM(pos,4,M); \
    CHECK_DIM(pos,5,N); \
    CHECK_DIM(pos,6,K); \
    if((Order)==CblasRowMajor) { \
        if(__trasF==CblasNoTrans) { \
            if((lda)<CBLAS_MAX(1,K)) { \
                pos = 9; \
            } \
        } else { \
            if((lda)<CBLAS_MAX(1,M)) { \
                pos = 9; \
            } \
        } \
        if(__trasG==CblasNoTrans) { \
            if((ldb)<CBLAS_MAX(1,M)) { \
                pos = 11; \
            } \
        } else { \
            if((ldb)<CBLAS_MAX(1,K)) { \
                pos = 11; \
            } \
        } \
        if((ldc)<CBLAS_MAX(1,N)) { \
            pos = 14; \
        } \
    } else if((Order)==CblasColMajor) { \
        if(__trasF==CblasNoTrans) { \
            if((ldb)<CBLAS_MAX(1,K)) { \
                pos = 11; \
            } \
        } else { \
            if((ldb)<CBLAS_MAX(1,M)) { \
                pos = 11; \
            } \
        } \
        if(__trasG==CblasNoTrans) { \
            if((lda)<CBLAS_MAX(1,M)) { \
                pos = 9; \
            } \
        } else { \
            if((lda)<CBLAS_MAX(1,K)) { \
                pos = 9; \
            } \
        } \
        if((ldc)<CBLAS_MAX(1,M)) { \
            pos = 14; \
        } \
    } \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SYMM(pos,Order,Side,Uplo,M,N,alpha,A,lda,B,ldb,beta,C,ldc) \
{ \
    int __filA=0; \
    if((Order)==CblasRowMajor) { \
        if((Side)==CblasLeft) { \
            __filA = N; \
        } else { \
            __filA = M; \
        } \
    } else { \
        if((Side)==CblasLeft) { \
            __filA = M; \
        } else { \
            __filA = N; \
        } \
    } \
    CHECK_ORDER(pos,1,Order); \
    CHECK_SIDE(pos,2,Side); \
    CHECK_UPLO(pos,3,Uplo); \
    CHECK_DIM(pos,4,M); \
    CHECK_DIM(pos,5,N); \
    if((Order)==CblasRowMajor) { \
        if((lda)<CBLAS_MAX(1,__filA)) { \
                pos = 8; \
        } \
        if((ldb)<CBLAS_MAX(1,N)) { \
                pos = 10; \
        } \
        if((ldc)<CBLAS_MAX(1,N)) { \
                pos = 13; \
        } \
    } else if((Order)==CblasColMajor) { \
        if((lda)<CBLAS_MAX(1,__filA)) { \
                pos = 8; \
        } \
        if((ldb)<CBLAS_MAX(1,M)) { \
                pos = 10; \
        } \
        if((ldc)<CBLAS_MAX(1,M)) { \
                pos = 13; \
        } \
    } \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SYRK(pos,Order,Uplo,Trans,N,K,alpha,A,lda,beta,C,ldc) \
{ \
    int __filA=0; \
    if((Order)==CblasRowMajor) { \
        if((Trans)==CblasNoTrans) { \
            __filA = K; \
        } else { \
            __filA = N; \
        } \
    } else { \
        if((Trans)==CblasNoTrans) { \
            __filA = N; \
        } else { \
            __filA = K; \
        } \
    } \
    CHECK_ORDER(pos,1,Order); \
    CHECK_UPLO(pos,2,Uplo); \
    CHECK_TRANSPOSE(pos,3,Trans); \
    CHECK_DIM(pos,4,N); \
    CHECK_DIM(pos,5,K); \
    if((lda)<CBLAS_MAX(1,__filA)) { \
        pos = 8; \
    } \
    if((ldc)<CBLAS_MAX(1,N)) { \
        pos = 11; \
    } \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SYR2K(pos,Order,Uplo,Trans,N,K,alpha,A,lda,B,ldb,beta,C,ldc) \
{ \
    int __fil=0; \
    if((Order)==CblasRowMajor) { \
        if((Trans)==CblasNoTrans) { \
            __fil = K; \
        } else { \
            __fil = N; \
        } \
    } else { \
        if((Trans)==CblasNoTrans) { \
            __fil = N; \
        } else { \
            __fil = K; \
        } \
    } \
    CHECK_ORDER(pos,1,Order); \
    CHECK_UPLO(pos,2,Uplo); \
    CHECK_TRANSPOSE(pos,3,Trans); \
    CHECK_DIM(pos,4,N); \
    CHECK_DIM(pos,5,K); \
    if((lda)<CBLAS_MAX(1,__fil)) { \
        pos = 8; \
    } \
    if((ldb)<CBLAS_MAX(1,__fil)) { \
        pos = 11; \
    } \
    if((ldc)<CBLAS_MAX(1,N)) { \
        pos = 14; \
    } \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TRMM(pos,Order,Side,Uplo,TransA,Diag,M,N,alpha,A,lda,B,ldb) \
{ \
    int __fil=0; \
    if((Order)==CblasRowMajor) { \
        if((Side)==CblasLeft) { \
            __fil = N; \
        } else { \
            __fil = M; \
        } \
    } else { \
        if((Side)==CblasLeft) { \
            __fil = M; \
        } else { \
            __fil = N; \
        } \
    } \
    CHECK_ORDER(pos,1,Order); \
    CHECK_SIDE(pos,2,Side); \
    CHECK_UPLO(pos,3,Uplo); \
    CHECK_TRANSPOSE(pos,4,Trans); \
    CHECK_DIAG(pos,5,Diag); \
    CHECK_DIM(pos,6,M); \
    CHECK_DIM(pos,7,N); \
    if((lda)<CBLAS_MAX(1,__fil)) { \
        pos = 10; \
    } \
    if((Order)==CblasRowMajor) { \
        if((ldb)<CBLAS_MAX(1,N)) { \
            pos = 12; \
        } \
    } else { \
        if((ldb)<CBLAS_MAX(1,M)) { \
            pos = 12; \
        } \
    } \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TRSM(pos,Order,Side,Uplo,TransA,Diag,M,N,alpha,A,lda,B,ldb) \
CBLAS_ERROR_TRMM(pos,Order,Side,Uplo,TransA,Diag,M,N,alpha,A,lda,B,ldb)
////////////////////////////////////////////////////////////////////////////////
/*
 * Routines with prefixes C and Z only
 */

#define CBLAS_ERROR_CZ_HEMM(pos,Order,Side,Uplo,M,N,alpha,A,lda,B,ldb,beta,C,ldc) \
CBLAS_ERROR_SYMM(pos,Order,Side,Uplo,M,N,alpha,A,lda,B,ldb,beta,C,ldc)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HERK(pos,Order,Uplo,Trans,N,K,alpha,A,lda,beta,C,ldc) \
CBLAS_ERROR_SYRK(pos,Order,Uplo,Trans,N,K,alpha,A,lda,beta,C,ldc)
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HER2K(pos,Order,Uplo,Trans,N,K,alpha,A,lda,B,ldb,beta,C,ldc) \
CBLAS_ERROR_SYR2K(pos,Order,Uplo,Trans,N,K,alpha,A,lda,B,ldb,beta,C,ldc)
////////////////////////////////////////////////////////////////////////////////
#endif
_______________________________________________
Help-gsl mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-gsl

Reply via email to