openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
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.
 
 
 
 
 
 

543 lines
14 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/Bounds.h
* \author Hans Joachim Ferreau, Andreas Potschka, Christian Kirches
* \version 3.1embedded
* \date 2007-2015
*
* Declaration of the Bounds class designed to manage working sets of
* bounds within a QProblem.
*/
#ifndef QPOASES_BOUNDS_H
#define QPOASES_BOUNDS_H
#include <qpOASES_e/Indexlist.h>
BEGIN_NAMESPACE_QPOASES
/**
* \brief Manages working sets of bounds (= box constraints).
*
* This class manages working sets of bounds (= box constraints)
* by storing index sets and other status information.
*
* \author Hans Joachim Ferreau
* \version 3.1embedded
* \date 2007-2015
*/
typedef struct
{
Indexlist *freee; /**< Index list of free variables. */
Indexlist *fixed; /**< Index list of fixed variables. */
Indexlist *shiftedFreee; /**< Memory for shifting free variables. */
Indexlist *shiftedFixed; /**< Memory for shifting fixed variables. */
Indexlist *rotatedFreee; /**< Memory for rotating free variables. */
Indexlist *rotatedFixed; /**< Memory for rotating fixed variables. */
SubjectToType *type; /**< Type of bounds. */
SubjectToStatus *status; /**< Status of bounds. */
SubjectToType *typeTmp; /**< Temp memory for type of bounds. */
SubjectToStatus *statusTmp; /**< Temp memory for status of bounds. */
BooleanType noLower; /**< This flag indicates if there is no lower bound on any variable. */
BooleanType noUpper; /**< This flag indicates if there is no upper bound on any variable. */
int n; /**< Total number of bounds. */
} Bounds;
int Bounds_calculateMemorySize( int n);
char *Bounds_assignMemory(int n, Bounds **mem, void *raw_memory);
Bounds *Bounds_createMemory( int n );
/** Constructor which takes the number of bounds. */
void BoundsCON( Bounds* _THIS,
int _n /**< Number of bounds. */
);
/** Copies all members from given rhs object.
* \return SUCCESSFUL_RETURN */
void BoundsCPY( Bounds* FROM,
Bounds* TO
);
/** Initialises object with given number of bounds.
* \return SUCCESSFUL_RETURN \n
RET_INVALID_ARGUMENTS */
returnValue Bounds_init( Bounds* _THIS,
int _n /**< Number of bounds. */
);
/** Initially adds number of a new (i.e. not yet in the list) bound to
* given index set.
* \return SUCCESSFUL_RETURN \n
RET_SETUP_BOUND_FAILED \n
RET_INDEX_OUT_OF_BOUNDS \n
RET_INVALID_ARGUMENTS */
returnValue Bounds_setupBound( Bounds* _THIS,
int number, /**< Number of new bound. */
SubjectToStatus _status /**< Status of new bound. */
);
/** Initially adds all numbers of new (i.e. not yet in the list) bounds to
* to the index set of free bounds; the order depends on the SujectToType
* of each index.
* \return SUCCESSFUL_RETURN \n
RET_SETUP_BOUND_FAILED */
returnValue Bounds_setupAllFree( Bounds* _THIS
);
/** Initially adds all numbers of new (i.e. not yet in the list) bounds to
* to the index set of fixed bounds (on their lower bounds);
* the order depends on the SujectToType of each index.
* \return SUCCESSFUL_RETURN \n
RET_SETUP_BOUND_FAILED */
returnValue Bounds_setupAllLower( Bounds* _THIS
);
/** Initially adds all numbers of new (i.e. not yet in the list) bounds to
* to the index set of fixed bounds (on their upper bounds);
* the order depends on the SujectToType of each index.
* \return SUCCESSFUL_RETURN \n
RET_SETUP_BOUND_FAILED */
returnValue Bounds_setupAllUpper( Bounds* _THIS
);
/** Moves index of a bound from index list of fixed to that of free bounds.
* \return SUCCESSFUL_RETURN \n
RET_MOVING_BOUND_FAILED \n
RET_INDEX_OUT_OF_BOUNDS */
returnValue Bounds_moveFixedToFree( Bounds* _THIS,
int number /**< Number of bound to be freed. */
);
/** Moves index of a bound from index list of free to that of fixed bounds.
* \return SUCCESSFUL_RETURN \n
RET_MOVING_BOUND_FAILED \n
RET_INDEX_OUT_OF_BOUNDS */
returnValue Bounds_moveFreeToFixed( Bounds* _THIS,
int number, /**< Number of bound to be fixed. */
SubjectToStatus _status /**< Status of bound to be fixed. */
);
/** Flip fixed bound.
* \return SUCCESSFUL_RETURN \n
RET_MOVING_BOUND_FAILED \n
RET_INDEX_OUT_OF_BOUNDS */
returnValue Bounds_flipFixed( Bounds* _THIS,
int number
);
/** Swaps the indices of two free bounds within the index set.
* \return SUCCESSFUL_RETURN \n
RET_SWAPINDEX_FAILED */
returnValue Bounds_swapFree( Bounds* _THIS,
int number1, /**< Number of first bound. */
int number2 /**< Number of second bound. */
);
/** Returns number of variables.
* \return Number of variables. */
static inline int Bounds_getNV( Bounds* _THIS
);
/** Returns number of implicitly fixed variables.
* \return Number of implicitly fixed variables. */
static inline int Bounds_getNFV( Bounds* _THIS
);
/** Returns number of bounded (but possibly free) variables.
* \return Number of bounded (but possibly free) variables. */
static inline int Bounds_getNBV( Bounds* _THIS
);
/** Returns number of unbounded variables.
* \return Number of unbounded variables. */
static inline int Bounds_getNUV( Bounds* _THIS
);
/** Returns number of free variables.
* \return Number of free variables. */
static inline int Bounds_getNFR( Bounds* _THIS
);
/** Returns number of fixed variables.
* \return Number of fixed variables. */
static inline int Bounds_getNFX( Bounds* _THIS
);
/** Returns a pointer to free variables index list.
* \return Pointer to free variables index list. */
static inline Indexlist* Bounds_getFree( Bounds* _THIS
);
/** Returns a pointer to fixed variables index list.
* \return Pointer to fixed variables index list. */
static inline Indexlist* Bounds_getFixed( Bounds* _THIS
);
/** Returns number of bounds with given SubjectTo type.
* \return Number of bounds with given type. */
static inline int Bounds_getNumberOfType( Bounds* _THIS,
SubjectToType _type /**< Type of bound. */
);
/** Returns type of bound.
* \return Type of bound \n
RET_INDEX_OUT_OF_BOUNDS */
static inline SubjectToType Bounds_getType( Bounds* _THIS,
int i /**< Number of bound. */
);
/** Returns status of bound.
* \return Status of bound \n
ST_UNDEFINED */
static inline SubjectToStatus Bounds_getStatus( Bounds* _THIS,
int i /**< Number of bound. */
);
/** Sets type of bound.
* \return SUCCESSFUL_RETURN \n
RET_INDEX_OUT_OF_BOUNDS */
static inline returnValue Bounds_setType( Bounds* _THIS,
int i, /**< Number of bound. */
SubjectToType value /**< Type of bound. */
);
/** Sets status of bound.
* \return SUCCESSFUL_RETURN \n
RET_INDEX_OUT_OF_BOUNDS */
static inline returnValue Bounds_setStatus( Bounds* _THIS,
int i, /**< Number of bound. */
SubjectToStatus value /**< Status of bound. */
);
/** Sets status of lower bounds. */
static inline void Bounds_setNoLower( Bounds* _THIS,
BooleanType _status /**< Status of lower bounds. */
);
/** Sets status of upper bounds. */
static inline void Bounds_setNoUpper( Bounds* _THIS,
BooleanType _status /**< Status of upper bounds. */
);
/** Returns status of lower bounds.
* \return BT_TRUE if there is no lower bound on any variable. */
static inline BooleanType Bounds_hasNoLower( Bounds* _THIS
);
/** Returns status of upper bounds.
* \return BT_TRUE if there is no upper bound on any variable. */
static inline BooleanType Bounds_hasNoUpper( Bounds* _THIS
);
/** Shifts forward type and status of all bounds by a given
* offset. This offset has to lie within the range [0,n/2] and has to
* be an integer divisor of the total number of bounds n.
* Type and status of the first \<offset\> bounds is thrown away,
* type and status of the last \<offset\> bounds is doubled,
* e.g. for offset = 2: \n
* shift( {b1,b2,b3,b4,b5,b6} ) = {b3,b4,b5,b6,b5,b6}
* \return SUCCESSFUL_RETURN \n
RET_INDEX_OUT_OF_BOUNDS \n
RET_INVALID_ARGUMENTS \n
RET_SHIFTING_FAILED */
returnValue Bounds_shift( Bounds* _THIS,
int offset /**< Shift offset within the range [0,n/2] and integer divisor of n. */
);
/** Rotates forward type and status of all bounds by a given
* offset. This offset has to lie within the range [0,n].
* Example for offset = 2: \n
* rotate( {b1,b2,b3,b4,b5,b6} ) = {b3,b4,b5,b6,b1,b2}
* \return SUCCESSFUL_RETURN \n
RET_INDEX_OUT_OF_BOUNDS \n
RET_ROTATING_FAILED */
returnValue Bounds_rotate( Bounds* _THIS,
int offset /**< Rotation offset within the range [0,n]. */
);
/** Prints information on bounds object
* (in particular, lists of free and fixed bounds.
* \return SUCCESSFUL_RETURN \n
RET_INDEXLIST_CORRUPTED */
returnValue Bounds_print( Bounds* _THIS
);
/** Initially adds all numbers of new (i.e. not yet in the list) bounds to
* to the index set corresponding to the desired status;
* the order depends on the SujectToType of each index.
* \return SUCCESSFUL_RETURN \n
RET_SETUP_BOUND_FAILED */
returnValue Bounds_setupAll( Bounds* _THIS,
SubjectToStatus _status /**< Desired initial status for all bounds. */
);
/** Adds the index of a new bound to index set.
* \return SUCCESSFUL_RETURN \n
RET_ADDINDEX_FAILED \n
RET_INVALID_ARGUMENTS */
returnValue Bounds_addIndex( Bounds* _THIS,
Indexlist* const indexlist, /**< Index list to which the new index shall be added. */
int newnumber, /**< Number of new bound. */
SubjectToStatus newstatus /**< Status of new bound. */
);
/** Removes the index of a bound from index set.
* \return SUCCESSFUL_RETURN \n
RET_REMOVEINDEX_FAILED \n
RET_INVALID_ARGUMENTS */
returnValue Bounds_removeIndex( Bounds* _THIS,
Indexlist* const indexlist, /**< Index list from which the new index shall be removed. */
int removenumber /**< Number of bound to be removed. */
);
/** Swaps the indices of two constraints or bounds within the index set.
* \return SUCCESSFUL_RETURN \n
RET_SWAPINDEX_FAILED \n
RET_INVALID_ARGUMENTS */
returnValue Bounds_swapIndex( Bounds* _THIS,
Indexlist* const indexlist, /**< Index list in which the indices shold be swapped. */
int number1, /**< Number of first bound. */
int number2 /**< Number of second bound. */
);
/*
* g e t N u m b e r O f T y p e
*/
static inline int Bounds_getNumberOfType( Bounds* _THIS, SubjectToType _type )
{
int i;
int numberOfType = 0;
if ( _THIS->type != 0 )
{
for( i=0; i<_THIS->n; ++i )
if ( _THIS->type[i] == _type )
++numberOfType;
}
return numberOfType;
}
/*
* g e t T y p e
*/
static inline SubjectToType Bounds_getType( Bounds* _THIS, int i )
{
if ( ( i >= 0 ) && ( i < _THIS->n ) )
return _THIS->type[i];
return ST_UNKNOWN;
}
/*
* g e t S t a t u s
*/
static inline SubjectToStatus Bounds_getStatus( Bounds* _THIS, int i )
{
if ( ( i >= 0 ) && ( i < _THIS->n ) )
return _THIS->status[i];
return ST_UNDEFINED;
}
/*
* s e t T y p e
*/
static inline returnValue Bounds_setType( Bounds* _THIS, int i, SubjectToType value )
{
if ( ( i >= 0 ) && ( i < _THIS->n ) )
{
_THIS->type[i] = value;
return SUCCESSFUL_RETURN;
}
else
return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
}
/*
* s e t S t a t u s
*/
static inline returnValue Bounds_setStatus( Bounds* _THIS, int i, SubjectToStatus value )
{
if ( ( i >= 0 ) && ( i < _THIS->n ) )
{
_THIS->status[i] = value;
return SUCCESSFUL_RETURN;
}
else
return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
}
/*
* s e t N o L o w e r
*/
static inline void Bounds_setNoLower( Bounds* _THIS, BooleanType _status )
{
_THIS->noLower = _status;
}
/*
* s e t N o U p p e r
*/
static inline void Bounds_setNoUpper( Bounds* _THIS, BooleanType _status )
{
_THIS->noUpper = _status;
}
/*
* h a s N o L o w e r
*/
static inline BooleanType Bounds_hasNoLower( Bounds* _THIS )
{
return _THIS->noLower;
}
/*
* h a s N o U p p p e r
*/
static inline BooleanType Bounds_hasNoUpper( Bounds* _THIS )
{
return _THIS->noUpper;
}
/*
* g e t N V
*/
static inline int Bounds_getNV( Bounds* _THIS )
{
return _THIS->n;
}
/*
* g e t N F V
*/
static inline int Bounds_getNFV( Bounds* _THIS )
{
return Bounds_getNumberOfType( _THIS,ST_EQUALITY );
}
/*
* g e t N B V
*/
static inline int Bounds_getNBV( Bounds* _THIS )
{
return Bounds_getNumberOfType( _THIS,ST_BOUNDED );
}
/*
* g e t N U V
*/
static inline int Bounds_getNUV( Bounds* _THIS )
{
return Bounds_getNumberOfType( _THIS,ST_UNBOUNDED );
}
/*
* g e t N F R
*/
static inline int Bounds_getNFR( Bounds* _THIS )
{
return Indexlist_getLength( _THIS->freee );
}
/*
* g e t N F X
*/
static inline int Bounds_getNFX( Bounds* _THIS )
{
return Indexlist_getLength( _THIS->fixed );
}
/*
* g e t F r e e
*/
static inline Indexlist* Bounds_getFree( Bounds* _THIS )
{
return _THIS->freee;
}
/*
* g e t F i x e d
*/
static inline Indexlist* Bounds_getFixed( Bounds* _THIS )
{
return _THIS->fixed;
}
END_NAMESPACE_QPOASES
#endif /* QPOASES_BOUNDS_H */
/*
* end of file
*/