You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							287 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							287 lines
						
					
					
						
							11 KiB
						
					
					
				/*
 | 
						|
 *	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.1embedded
 | 
						|
 *	\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.1embedded
 | 
						|
 *	\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 */
 | 
						|
 |