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