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.
		
		
		
		
			
				
					222 lines
				
				6.3 KiB
			
		
		
			
		
	
	
					222 lines
				
				6.3 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	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/Indexlist.h
							 | 
						||
| 
								 | 
							
								 *	\author Hans Joachim Ferreau, Andreas Potschka, Christian Kirches
							 | 
						||
| 
								 | 
							
								 *	\version 3.1embedded
							 | 
						||
| 
								 | 
							
								 *	\date 2007-2015
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *	Declaration of the Indexlist class designed to manage index lists of
							 | 
						||
| 
								 | 
							
								 *	constraints and bounds within a SubjectTo object.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef QPOASES_INDEXLIST_H
							 | 
						||
| 
								 | 
							
								#define QPOASES_INDEXLIST_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <qpOASES_e/Utils.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								BEGIN_NAMESPACE_QPOASES
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 *	\brief Stores and manages index lists.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *	This class manages index lists of active/inactive bounds/constraints.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *	\author Hans Joachim Ferreau
							 | 
						||
| 
								 | 
							
								 *	\version 3.1embedded
							 | 
						||
| 
								 | 
							
								 *	\date 2007-2015
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef struct
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int *number;		/**< Array to store numbers of constraints or bounds. */
							 | 
						||
| 
								 | 
							
									int *iSort;			/**< Index list to sort vector \a number */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									int	length;			/**< Length of index list. */
							 | 
						||
| 
								 | 
							
									int	first;			/**< Physical index of first element. */
							 | 
						||
| 
								 | 
							
									int	last;			/**< Physical index of last element. */
							 | 
						||
| 
								 | 
							
									int	lastusedindex;	/**< Physical index of last entry in index list. */
							 | 
						||
| 
								 | 
							
									int	physicallength;	/**< Physical length of index list. */
							 | 
						||
| 
								 | 
							
								} Indexlist;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int Indexlist_calculateMemorySize( int n);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								char *Indexlist_assignMemory(int n, Indexlist **mem, void *raw_memory);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Indexlist *Indexlist_createMemory( int n );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Constructor which takes the desired physical length of the index list. */
							 | 
						||
| 
								 | 
							
								void IndexlistCON(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
													int n	/**< Physical length of index list. */
							 | 
						||
| 
								 | 
							
													);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Copies all members from given rhs object.
							 | 
						||
| 
								 | 
							
								 *  \return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								void IndexlistCPY(	Indexlist* FROM,
							 | 
						||
| 
								 | 
							
													Indexlist* TO
							 | 
						||
| 
								 | 
							
													);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Initialises index list of desired physical length.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
								returnValue Indexlist_init(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
															int n		/**< Physical length of index list. */
							 | 
						||
| 
								 | 
							
															);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Creates an array of all numbers within the index set in correct order.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_INDEXLIST_CORRUPTED */
							 | 
						||
| 
								 | 
							
								returnValue Indexlist_getNumberArray(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
																		int** const numberarray	/**< Output: Array of numbers (NULL on error). */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Creates an array of all numbers within the index set in correct order.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
											RET_INDEXLIST_CORRUPTED */
							 | 
						||
| 
								 | 
							
								returnValue	Indexlist_getISortArray(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
																		int** const iSortArray	/**< Output: iSort Array. */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Determines the index within the index list at which a given number is stored.
							 | 
						||
| 
								 | 
							
								 *	\return >= 0: Index of given number. \n
							 | 
						||
| 
								 | 
							
								 			-1: Number not found. */
							 | 
						||
| 
								 | 
							
								int Indexlist_getIndex(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
														int givennumber	/**< Number whose index shall be determined. */
							 | 
						||
| 
								 | 
							
														);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the number stored at a given physical index.
							 | 
						||
| 
								 | 
							
								 *	\return >= 0: Number stored at given physical index. \n
							 | 
						||
| 
								 | 
							
								 			-RET_INDEXLIST_OUTOFBOUNDS */
							 | 
						||
| 
								 | 
							
								static inline int Indexlist_getNumber(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
																		int physicalindex	/**< Physical index of the number to be returned. */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the current length of the index list.
							 | 
						||
| 
								 | 
							
								 *	\return Current length of the index list. */
							 | 
						||
| 
								 | 
							
								static inline int Indexlist_getLength(	Indexlist* _THIS
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns last number within the index list.
							 | 
						||
| 
								 | 
							
								 *	\return Last number within the index list. */
							 | 
						||
| 
								 | 
							
								static inline int Indexlist_getLastNumber(	Indexlist* _THIS
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Adds number to index list.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_INDEXLIST_MUST_BE_REORDERD \n
							 | 
						||
| 
								 | 
							
								 			RET_INDEXLIST_EXCEEDS_MAX_LENGTH */
							 | 
						||
| 
								 | 
							
								returnValue Indexlist_addNumber(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
																	int addnumber			/**< Number to be added. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Removes number from index list.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue Indexlist_removeNumber(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
																	int removenumber	/**< Number to be removed. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Swaps two numbers within index list.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue Indexlist_swapNumbers(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
																	int number1,		/**< First number for swapping. */
							 | 
						||
| 
								 | 
							
																	int number2			/**< Second number for swapping. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Determines if a given number is contained in the index set.
							 | 
						||
| 
								 | 
							
								 *	\return BT_TRUE iff number is contain in the index set */
							 | 
						||
| 
								 | 
							
								static inline BooleanType Indexlist_isMember(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
																				int _number		/**< Number to be tested for membership. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Find first index j between -1 and length in sorted list of indices
							 | 
						||
| 
								 | 
							
								 *  iSort such that numbers[iSort[j]] <= i < numbers[iSort[j+1]]. Uses
							 | 
						||
| 
								 | 
							
								 *  bisection.
							 | 
						||
| 
								 | 
							
								 *  \return j. */
							 | 
						||
| 
								 | 
							
								int Indexlist_findInsert(	Indexlist* _THIS,
							 | 
						||
| 
								 | 
							
															int i
							 | 
						||
| 
								 | 
							
															);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t N u m b e r
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int Indexlist_getNumber( Indexlist* _THIS, int physicalindex )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									/* consistency check */
							 | 
						||
| 
								 | 
							
									if ( ( physicalindex < 0 ) || ( physicalindex > _THIS->length ) )
							 | 
						||
| 
								 | 
							
										return -RET_INDEXLIST_OUTOFBOUNDS;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return _THIS->number[physicalindex];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t L e n g t h
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int Indexlist_getLength( Indexlist* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return _THIS->length;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t L a s t N u m b e r
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int Indexlist_getLastNumber( Indexlist* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return _THIS->number[_THIS->length-1];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t L a s t N u m b e r
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline BooleanType Indexlist_isMember( Indexlist* _THIS, int _number )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if ( Indexlist_getIndex( _THIS,_number ) >= 0 )
							 | 
						||
| 
								 | 
							
										return BT_TRUE;
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										return BT_FALSE;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								END_NAMESPACE_QPOASES
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif	/* QPOASES_INDEXLIST_H */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	end of file
							 | 
						||
| 
								 | 
							
								 */
							 |