/*
* This file is part of qpOASES .
*
* qpOASES - - An Implementation of the Online Active Set Strategy .
* Copyright ( C ) 2007 - 2015 by Hans Joachim Ferreau , Andreas Potschka ,
* Christian Kirches et al . All rights reserved .
*
* qpOASES is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* qpOASES 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 Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with qpOASES ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*
*/
/**
* \ file include / qpOASES_e / Matrices . h
* \ author Hans Joachim Ferreau , Andreas Potschka , Christian Kirches
* \ version 3.1 embedded
* \ date 2009 - 2015
*
* Various matrix classes : Abstract base matrix class , dense and sparse matrices ,
* including symmetry exploiting specializations .
*/
# ifndef QPOASES_MATRICES_H
# define QPOASES_MATRICES_H
# ifdef __USE_SINGLE_PRECISION__
// single precision
# define GEMM sgemm_
# define GEMV sgemv_
// #define SYR ssyr_
// #define SYR2 ssyr2_
# define POTRF spotrf_
# else
// double precision
# define GEMM dgemm_
# define GEMV dgemv_
// #define SYR dsyr_
// #define SYR2 dsyr2_
# define POTRF dpotrf_
# endif /* __USE_SINGLE_PRECISION__ */
# ifdef EXTERNAL_BLAS
// double precision
void dgemm_ ( char * ta , char * tb , int * m , int * n , int * k , double * alpha , double * A , int * lda , double * B , int ldb , double * beta , double * C , int * ldc ) ;
void dgemv_ ( char * ta , int * m , int * n , double * alpha , double * A , int * lda , double * x , int * incx , double * beta , double * y , int * incy ) ;
void dpotrf_ ( char * uplo , int * m , double * A , int * lda , int * info ) ;
// single precision
void sgemm_ ( char * ta , char * tb , int * m , int * n , int * k , float * alpha , float * A , int * lda , float * B , int ldb , float * beta , float * C , int * ldc ) ;
void sgemv_ ( char * ta , int * m , int * n , float * alpha , float * A , int * lda , float * x , int * incx , float * beta , float * y , int * incy ) ;
void spotrf_ ( char * uplo , int * m , float * A , int * lda , int * info ) ;
# else
/** Performs one of the matrix-matrix operation in double precision. */
void dgemm_ ( const char * , const char * , const unsigned long * , const unsigned long * , const unsigned long * ,
const double * , const double * , const unsigned long * , const double * , const unsigned long * ,
const double * , double * , const unsigned long * ) ;
/** Performs one of the matrix-matrix operation in single precision. */
void sgemm_ ( const char * , const char * , const unsigned long * , const unsigned long * , const unsigned long * ,
const float * , const float * , const unsigned long * , const float * , const unsigned long * ,
const float * , float * , const unsigned long * ) ;
/** Calculates the Cholesky factorization of a real symmetric positive definite matrix in double precision. */
void dpotrf_ ( const char * , const unsigned long * , double * , const unsigned long * , long * ) ;
/** Calculates the Cholesky factorization of a real symmetric positive definite matrix in single precision. */
void spotrf_ ( const char * , const unsigned long * , float * , const unsigned long * , long * ) ;
# endif
/** Performs a symmetric rank 1 operation in double precision. */
// void dsyr_ ( const char *, const unsigned long *, const double *, const double *,
// const unsigned long *, double *, const unsigned long *);
/** Performs a symmetric rank 1 operation in single precision. */
// void ssyr_ ( const char *, const unsigned long *, const float *, const float *,
// const unsigned long *, float *, const unsigned long *);
/** Performs a symmetric rank 2 operation in double precision. */
// void dsyr2_ ( const char *, const unsigned long *, const double *, const double *,
// const unsigned long *, const double *, const unsigned long *, double *, const unsigned long *);
/** Performs a symmetric rank 2 operation in single precision. */
// void ssyr2_ ( const char *, const unsigned long *, const float *, const float *,
// const unsigned long *, const float *, const unsigned long *, float *, const unsigned long *);
# include <qpOASES_e/Indexlist.h>
BEGIN_NAMESPACE_QPOASES
/**
* \ brief Interfaces matrix - vector operations tailored to general dense matrices .
*
* Dense matrix class ( row major format ) .
*
* \ author Andreas Potschka , Christian Kirches , Hans Joachim Ferreau
* \ version 3.1 embedded
* \ date 2011 - 2015
*/
typedef struct
{
real_t * val ; /**< Vector of entries. */
int nRows ; /**< Number of rows. */
int nCols ; /**< Number of columns. */
int leaDim ; /**< Leading dimension. */
} DenseMatrix ;
int DenseMatrix_calculateMemorySize ( int m , int n ) ;
char * DenseMatrix_assignMemory ( int m , int n , DenseMatrix * * mem , void * raw_memory ) ;
DenseMatrix * DenseMatrix_createMemory ( int m , int n ) ;
/** Constructor from vector of values.
* Caution : Data pointer must be valid throughout lifetime
*/
void DenseMatrixCON ( DenseMatrix * _THIS ,
int m , /**< Number of rows. */
int n , /**< Number of columns. */
int lD , /**< Leading dimension. */
real_t * v /**< Values. */
) ;
void DenseMatrixCPY ( DenseMatrix * FROM ,
DenseMatrix * TO
) ;
/** Frees all internal memory. */
void DenseMatrix_free ( DenseMatrix * _THIS ) ;
/** Constructor from vector of values.
* Caution : Data pointer must be valid throughout lifetime
*/
returnValue DenseMatrix_init ( DenseMatrix * _THIS ,
int m , /**< Number of rows. */
int n , /**< Number of columns. */
int lD , /**< Leading dimension. */
real_t * v /**< Values. */
) ;
/** Returns i-th diagonal entry.
* \ return i - th diagonal entry */
real_t DenseMatrix_diag ( DenseMatrix * _THIS ,
int i /**< Index. */
) ;
/** Checks whether matrix is square and diagonal.
* \ return BT_TRUE iff matrix is square and diagonal ; \ n
* BT_FALSE otherwise . */
BooleanType DenseMatrix_isDiag ( DenseMatrix * _THIS ) ;
/** Get the N-norm of the matrix
* \ return N - norm of the matrix
*/
real_t DenseMatrix_getNorm ( DenseMatrix * _THIS ,
int type /**< Norm type, 1: one-norm, 2: Euclidean norm. */
) ;
/** Get the N-norm of a row
* \ return N - norm of row \ a rNum
*/
real_t DenseMatrix_getRowNorm ( DenseMatrix * _THIS ,
int rNum , /**< Row number. */
int type /**< Norm type, 1: one-norm, 2: Euclidean norm. */
) ;
/** Retrieve indexed entries of matrix row multiplied by alpha.
* \ return SUCCESSFUL_RETURN */
returnValue DenseMatrix_getRow ( DenseMatrix * _THIS ,
int rNum , /**< Row number. */
const Indexlist * const icols , /**< Index list specifying columns. */
real_t alpha , /**< Scalar factor. */
real_t * row /**< Output row vector. */
) ;
/** Retrieve indexed entries of matrix column multiplied by alpha.
* \ return SUCCESSFUL_RETURN */
returnValue DenseMatrix_getCol ( DenseMatrix * _THIS ,
int cNum , /**< Column number. */
const Indexlist * const irows , /**< Index list specifying rows. */
real_t alpha , /**< Scalar factor. */
real_t * col /**< Output column vector. */
) ;
/** Evaluate Y=alpha*A*X + beta*Y.
* \ return SUCCESSFUL_RETURN . */
returnValue DenseMatrix_times ( DenseMatrix * _THIS ,
int xN , /**< Number of vectors to multiply. */
real_t alpha , /**< Scalar factor for matrix vector product. */
const real_t * x , /**< Input vector to be multiplied. */
int xLD , /**< Leading dimension of input x. */
real_t beta , /**< Scalar factor for y. */
real_t * y , /**< Output vector of results. */
int yLD /**< Leading dimension of output y. */
) ;
/** Evaluate Y=alpha*A'*X + beta*Y.
* \ return SUCCESSFUL_RETURN . */
returnValue DenseMatrix_transTimes ( DenseMatrix * _THIS ,
int xN , /**< Number of vectors to multiply. */
real_t alpha , /**< Scalar factor for matrix vector product. */
const real_t * x , /**< Input vector to be multiplied. */
int xLD , /**< Leading dimension of input x. */
real_t beta , /**< Scalar factor for y. */
real_t * y , /**< Output vector of results. */
int yLD /**< Leading dimension of output y. */
) ;
/** Evaluate matrix vector product with submatrix given by Indexlist.
* \ return SUCCESSFUL_RETURN */
returnValue DenseMatrix_subTimes ( DenseMatrix * _THIS ,
const Indexlist * const irows , /**< Index list specifying rows. */
const Indexlist * const icols , /**< Index list specifying columns. */
int xN , /**< Number of vectors to multiply. */
real_t alpha , /**< Scalar factor for matrix vector product. */
const real_t * x , /**< Input vector to be multiplied. */
int xLD , /**< Leading dimension of input x. */
real_t beta , /**< Scalar factor for y. */
real_t * y , /**< Output vector of results. */
int yLD , /**< Leading dimension of output y. */
BooleanType yCompr /**< Compressed storage for y. */
) ;
/** Evaluate matrix transpose vector product.
* \ return SUCCESSFUL_RETURN */
returnValue DenseMatrix_subTransTimes ( DenseMatrix * _THIS ,
const Indexlist * const irows , /**< Index list specifying rows. */
const Indexlist * const icols , /**< Index list specifying columns. */
int xN , /**< Number of vectors to multiply. */
real_t alpha , /**< Scalar factor for matrix vector product. */
const real_t * x , /**< Input vector to be multiplied. */
int xLD , /**< Leading dimension of input x. */
real_t beta , /**< Scalar factor for y. */
real_t * y , /**< Output vector of results. */
int yLD /**< Leading dimension of output y. */
) ;
/** Adds given offset to diagonal of matrix.
* \ return SUCCESSFUL_RETURN \ n
RET_NO_DIAGONAL_AVAILABLE */
returnValue DenseMatrix_addToDiag ( DenseMatrix * _THIS ,
real_t alpha /**< Diagonal offset. */
) ;
/** Prints matrix to screen.
* \ return SUCCESSFUL_RETURN */
returnValue DenseMatrix_print ( DenseMatrix * _THIS
) ;
static inline real_t * DenseMatrix_getVal ( DenseMatrix * _THIS ) { return _THIS - > val ; }
/** Compute bilinear form y = x'*H*x using submatrix given by index list.
* \ return SUCCESSFUL_RETURN */
returnValue DenseMatrix_bilinear ( DenseMatrix * _THIS ,
const Indexlist * const icols , /**< Index list specifying columns of x. */
int xN , /**< Number of vectors to multiply. */
const real_t * x , /**< Input vector to be multiplied (uncompressed). */
int xLD , /**< Leading dimension of input x. */
real_t * y , /**< Output vector of results (compressed). */
int yLD /**< Leading dimension of output y. */
) ;
END_NAMESPACE_QPOASES
# endif /* QPOASES_MATRICES_H */