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 */
 | |
| 
 |