open source driving agent
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.
 
 
 
 
 
 

500 lines
16 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/Utils.h
* \author Hans Joachim Ferreau, Andreas Potschka, Christian Kirches
* \version 3.1embedded
* \date 2007-2015
*
* Declaration of some utilities for working with the different QProblem classes.
*/
#ifndef QPOASES_UTILS_H
#define QPOASES_UTILS_H
#include <qpOASES_e/MessageHandling.h>
BEGIN_NAMESPACE_QPOASES
/** Prints a vector.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_printV( const real_t* const v, /**< Vector to be printed. */
int n /**< Length of vector. */
);
/** Prints a permuted vector.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_printPV( const real_t* const v, /**< Vector to be printed. */
int n, /**< Length of vector. */
const int* const V_idx /**< Pemutation vector. */
);
/** Prints a named vector.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_printNV( const real_t* const v, /**< Vector to be printed. */
int n, /**< Length of vector. */
const char* name /** Name of vector. */
);
/** Prints a matrix.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_printM( const real_t* const M, /**< Matrix to be printed. */
int nrow, /**< Row number of matrix. */
int ncol /**< Column number of matrix. */
);
/** Prints a permuted matrix.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_printPM( const real_t* const M, /**< Matrix to be printed. */
int nrow, /**< Row number of matrix. */
int ncol , /**< Column number of matrix. */
const int* const ROW_idx, /**< Row pemutation vector. */
const int* const COL_idx /**< Column pemutation vector. */
);
/** Prints a named matrix.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_printNM( const real_t* const M, /**< Matrix to be printed. */
int nrow, /**< Row number of matrix. */
int ncol, /**< Column number of matrix. */
const char* name /** Name of matrix. */
);
/** Prints an index array.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_printI( const int* const _index, /**< Index array to be printed. */
int n /**< Length of index array. */
);
/** Prints a named index array.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_printNI( const int* const _index, /**< Index array to be printed. */
int n, /**< Length of index array. */
const char* name /**< Name of index array. */
);
/** Prints a string to desired output target (useful also for MATLAB output!).
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_myPrintf( const char* s /**< String to be written. */
);
/** Prints qpOASES copyright notice.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_printCopyrightNotice( );
/** Reads a real_t matrix from file.
* \return SUCCESSFUL_RETURN \n
RET_UNABLE_TO_OPEN_FILE \n
RET_UNABLE_TO_READ_FILE */
returnValue qpOASES_readFromFileM( real_t* data, /**< Matrix to be read from file. */
int nrow, /**< Row number of matrix. */
int ncol, /**< Column number of matrix. */
const char* datafilename /**< Data file name. */
);
/** Reads a real_t vector from file.
* \return SUCCESSFUL_RETURN \n
RET_UNABLE_TO_OPEN_FILE \n
RET_UNABLE_TO_READ_FILE */
returnValue qpOASES_readFromFileV( real_t* data, /**< Vector to be read from file. */
int n, /**< Length of vector. */
const char* datafilename /**< Data file name. */
);
/** Reads an integer (column) vector from file.
* \return SUCCESSFUL_RETURN \n
RET_UNABLE_TO_OPEN_FILE \n
RET_UNABLE_TO_READ_FILE */
returnValue qpOASES_readFromFileI( int* data, /**< Vector to be read from file. */
int n, /**< Length of vector. */
const char* datafilename /**< Data file name. */
);
/** Writes a real_t matrix into a file.
* \return SUCCESSFUL_RETURN \n
RET_UNABLE_TO_OPEN_FILE */
returnValue qpOASES_writeIntoFileM( const real_t* const data, /**< Matrix to be written into file. */
int nrow, /**< Row number of matrix. */
int ncol, /**< Column number of matrix. */
const char* datafilename, /**< Data file name. */
BooleanType append /**< Indicates if data shall be appended if the file already exists (otherwise it is overwritten). */
);
/** Writes a real_t vector into a file.
* \return SUCCESSFUL_RETURN \n
RET_UNABLE_TO_OPEN_FILE */
returnValue qpOASES_writeIntoFileV( const real_t* const data, /**< Vector to be written into file. */
int n, /**< Length of vector. */
const char* datafilename, /**< Data file name. */
BooleanType append /**< Indicates if data shall be appended if the file already exists (otherwise it is overwritten). */
);
/** Writes an integer (column) vector into a file.
* \return SUCCESSFUL_RETURN \n
RET_UNABLE_TO_OPEN_FILE */
returnValue qpOASES_writeIntoFileI( const int* const integer, /**< Integer vector to be written into file. */
int n, /**< Length of vector. */
const char* datafilename, /**< Data file name. */
BooleanType append /**< Indicates if integer shall be appended if the file already exists (otherwise it is overwritten). */
);
/** Writes a real_t matrix/vector into a Matlab binary file.
* \return SUCCESSFUL_RETURN \n
RET_INVALID_ARGUMENTS
RET_UNABLE_TO_WRITE_FILE */
returnValue qpOASES_writeIntoMatFile( FILE* const matFile, /**< Pointer to Matlab binary file. */
const real_t* const data, /**< Data to be written into file. */
int nRows, /**< Row number of matrix. */
int nCols, /**< Column number of matrix. */
const char* name /**< Matlab name of matrix/vector to be stored. */
);
/** Writes in integer matrix/vector into a Matlab binary file.
* \return SUCCESSFUL_RETURN \n
RET_INVALID_ARGUMENTS
RET_UNABLE_TO_WRITE_FILE */
returnValue qpOASES_writeIntoMatFileI( FILE* const matFile, /**< Pointer to Matlab binary file. */
const int* const data, /**< Data to be written into file. */
int nRows, /**< Row number of matrix. */
int nCols, /**< Column number of matrix. */
const char* name /**< Matlab name of matrix/vector to be stored. */
);
/** Returns the current system time.
* \return current system time */
real_t qpOASES_getCPUtime( );
/** Returns the N-norm of a vector.
* \return >= 0.0: successful */
real_t qpOASES_getNorm( const real_t* const v, /**< Vector. */
int n, /**< Vector's dimension. */
int type /**< Norm type, 1: one-norm, 2: Euclidean norm. */
);
/** Tests whether two real-valued arguments are (numerically) equal.
* \return BT_TRUE: arguments differ not more than TOL \n
BT_FALSE: arguments differ more than TOL */
static inline BooleanType qpOASES_isEqual( real_t x, /**< First real number. */
real_t y, /**< Second real number. */
real_t TOL /**< Tolerance for comparison. */
);
/** Tests whether a real-valued argument is (numerically) zero.
* \return BT_TRUE: argument differs from 0.0 not more than TOL \n
BT_FALSE: argument differs from 0.0 more than TOL */
static inline BooleanType qpOASES_isZero( real_t x, /**< Real number. */
real_t TOL /**< Tolerance for comparison. */
);
/** Returns sign of a real-valued argument.
* \return 1.0: argument is non-negative \n
-1.0: argument is negative */
static inline real_t qpOASES_getSign( real_t arg /**< real-valued argument whose sign is to be determined. */
);
/** Returns maximum of two integers.
* \return Maximum of two integers */
static inline int qpOASES_getMaxI( int x, /**< First integer. */
int y /**< Second integer. */
);
/** Returns minimum of two integers.
* \return Minimum of two integers */
static inline int qpOASES_getMinI( int x, /**< First integer. */
int y /**< Second integer. */
);
/** Returns maximum of two reals.
* \return Maximum of two reals */
static inline real_t qpOASES_getMax( real_t x, /**< First real number. */
real_t y /**< Second real number. */
);
/** Returns minimum of two reals.
* \return Minimum of two reals */
static inline real_t qpOASES_getMin( real_t x, /**< First real number. */
real_t y /**< Second real number. */
);
/** Returns the absolute value of a real_t-valued argument.
* \return Absolute value of a real_t-valued argument */
static inline real_t qpOASES_getAbs( real_t x /**< real_t-valued argument. */
);
/** Returns the square-root of a real number.
* \return Square-root of a real number */
static inline real_t qpOASES_getSqrt( real_t x /**< Non-negative real number. */
);
/** Computes the maximum violation of the KKT optimality conditions
* of given iterate for given QP data. */
returnValue qpOASES_getKktViolation( int nV, /**< Number of variables. */
int nC, /**< Number of constraints. */
const real_t* const H, /**< Hessian matrix (may be NULL if Hessian is zero or identity matrix). */
const real_t* const g, /**< Gradient vector. */
const real_t* const A, /**< Constraint matrix. */
const real_t* const lb, /**< Lower bound vector (on variables). */
const real_t* const ub, /**< Upper bound vector (on variables). */
const real_t* const lbA, /**< Lower constraints' bound vector. */
const real_t* const ubA, /**< Upper constraints' bound vector. */
const real_t* const x, /**< Primal trial vector. */
const real_t* const y, /**< Dual trial vector. */
real_t* const _stat, /**< Output: maximum value of stationarity condition residual. */
real_t* const feas, /**< Output: maximum value of primal feasibility violation. */
real_t* const cmpl /**< Output: maximum value of complementarity residual. */
);
/** Computes the maximum violation of the KKT optimality conditions
* of given iterate for given QP data. */
returnValue qpOASES_getKktViolationSB( int nV, /**< Number of variables. */
const real_t* const H, /**< Hessian matrix (may be NULL if Hessian is zero or identity matrix). */
const real_t* const g, /**< Gradient vector. */
const real_t* const lb, /**< Lower bound vector (on variables). */
const real_t* const ub, /**< Upper bound vector (on variables). */
const real_t* const x, /**< Primal trial vector. */
const real_t* const y, /**< Dual trial vector. */
real_t* const _stat, /**< Output: maximum value of stationarity condition residual. */
real_t* const feas, /**< Output: maximum value of primal feasibility violation. */
real_t* const cmpl /**< Output: maximum value of complementarity residual. */
);
/** Writes a value of BooleanType into a string.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_convertBooleanTypeToString( BooleanType value, /**< Value to be written. */
char* const string /**< Input: String of sufficient size, \n
Output: String containing value. */
);
/** Writes a value of SubjectToStatus into a string.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_convertSubjectToStatusToString( SubjectToStatus value, /**< Value to be written. */
char* const string /**< Input: String of sufficient size, \n
Output: String containing value. */
);
/** Writes a value of PrintLevel into a string.
* \return SUCCESSFUL_RETURN */
returnValue qpOASES_convertPrintLevelToString( PrintLevel value, /**< Value to be written. */
char* const string /**< Input: String of sufficient size, \n
Output: String containing value. */
);
/** Converts a returnValue from an QProblem(B) object into a more
* simple status flag.
*
* \return 0: QP problem solved
* 1: QP could not be solved within given number of iterations
* -1: QP could not be solved due to an internal error
* -2: QP is infeasible (and thus could not be solved)
* -3: QP is unbounded (and thus could not be solved)
*/
int qpOASES_getSimpleStatus( returnValue returnvalue, /**< ReturnValue to be analysed. */
BooleanType doPrintStatus /**< Flag indicating whether simple status shall be printed to screen. */
);
/** Normalises QP constraints.
* \return SUCCESSFUL_RETURN \n
* RET_INVALID_ARGUMENTS */
returnValue qpOASES_normaliseConstraints( int nV, /**< Number of variables. */
int nC, /**< Number of constraints. */
real_t* A, /**< Input: Constraint matrix, \n
Output: Normalised constraint matrix. */
real_t* lbA, /**< Input: Constraints' lower bound vector, \n
Output: Normalised constraints' lower bound vector. */
real_t* ubA, /**< Input: Constraints' upper bound vector, \n
Output: Normalised constraints' upper bound vector. */
int type /**< Norm type, 1: one-norm, 2: Euclidean norm. */
);
#ifdef __DEBUG__
/** Writes matrix with given dimension into specified file. */
void gdb_printmat( const char *fname, /**< File name. */
real_t *M, /**< Matrix to be written. */
int n, /**< Number of rows. */
int m, /**< Number of columns. */
int ldim /**< Leading dimension. */
);
#endif /* __DEBUG__ */
#if defined(__DSPACE__) || defined(__XPCTARGET__)
void __cxa_pure_virtual( void );
#endif /* __DSPACE__ || __XPCTARGET__*/
/*
* i s E q u a l
*/
static inline BooleanType qpOASES_isEqual( real_t x,
real_t y,
real_t TOL
)
{
if ( qpOASES_getAbs(x-y) <= TOL )
return BT_TRUE;
else
return BT_FALSE;
}
/*
* i s Z e r o
*/
static inline BooleanType qpOASES_isZero( real_t x,
real_t TOL
)
{
if ( qpOASES_getAbs(x) <= TOL )
return BT_TRUE;
else
return BT_FALSE;
}
/*
* g e t S i g n
*/
static inline real_t qpOASES_getSign( real_t arg
)
{
if ( arg >= 0.0 )
return 1.0;
else
return -1.0;
}
/*
* g e t M a x
*/
static inline int qpOASES_getMaxI( int x,
int y
)
{
return (y<x) ? x : y;
}
/*
* g e t M i n
*/
static inline int qpOASES_getMinI( int x,
int y
)
{
return (y>x) ? x : y;
}
/*
* g e t M a x
*/
static inline real_t qpOASES_getMax( real_t x,
real_t y
)
{
#ifdef __NO_FMATH__
return (y<x) ? x : y;
#else
return (y<x) ? x : y;
/*return fmax(x,y); seems to be slower */
#endif
}
/*
* g e t M i n
*/
static inline real_t qpOASES_getMin( real_t x,
real_t y
)
{
#ifdef __NO_FMATH__
return (y>x) ? x : y;
#else
return (y>x) ? x : y;
/*return fmin(x,y); seems to be slower */
#endif
}
/*
* g e t A b s
*/
static inline real_t qpOASES_getAbs( real_t x
)
{
#ifdef __NO_FMATH__
return (x>=0.0) ? x : -x;
#else
return fabs(x);
#endif
}
/*
* g e t S q r t
*/
static inline real_t qpOASES_getSqrt( real_t x
)
{
#ifdef __NO_FMATH__
return sqrt(x); /* put your custom sqrt-replacement here */
#else
return sqrt(x);
#endif
}
END_NAMESPACE_QPOASES
#endif /* QPOASES_UTILS_H */
/*
* end of file
*/