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.
221 lines
6.3 KiB
221 lines
6.3 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/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
|
|
*/
|
|
|