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.
 
 
 
 
 
 

535 lines
15 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/Constraints.h
* \author Hans Joachim Ferreau, Andreas Potschka, Christian Kirches
* \version 3.1embedded
* \date 2007-2015
*
* Declaration of the Constraints class designed to manage working sets of
* constraints within a QProblem.
*/
#ifndef QPOASES_CONSTRAINTS_H
#define QPOASES_CONSTRAINTS_H
#include <qpOASES_e/Indexlist.h>
BEGIN_NAMESPACE_QPOASES
/**
* \brief Manages working sets of constraints.
*
* This class manages working sets of constraints by storing
* index sets and other status information.
*
* \author Hans Joachim Ferreau
* \version 3.1embedded
* \date 2007-2015
*/
typedef struct
{
Indexlist *active; /**< Index list of active constraints. */
Indexlist *inactive; /**< Index list of inactive constraints. */
Indexlist *shiftedActive; /**< Memory for shifting active constraints. */
Indexlist *shiftedInactive; /**< Memory for shifting inactive constraints. */
Indexlist *rotatedActive; /**< Memory for rotating active constraints. */
Indexlist *rotatedInactive; /**< Memory for rotating inactive constraints. */
SubjectToType *type; /**< Type of constraints. */
SubjectToStatus *status; /**< Status of constraints. */
SubjectToType *typeTmp; /**< Temp memory for type of constraints. */
SubjectToStatus *statusTmp; /**< Temp memory for status of constraints. */
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 constraints. */
} Constraints;
int Constraints_calculateMemorySize( int n);
char *Constraints_assignMemory(int n, Constraints **mem, void *raw_memory);
Constraints *Constraints_createMemory( int n );
/** Constructor which takes the number of constraints. */
void ConstraintsCON( Constraints* _THIS,
int _n /**< Number of constraints. */
);
/** Copies all members from given rhs object.
* \return SUCCESSFUL_RETURN */
void ConstraintsCPY( Constraints* FROM,
Constraints* TO
);
/** Initialises object with given number of constraints.
* \return SUCCESSFUL_RETURN \n
RET_INVALID_ARGUMENTS */
returnValue Constraints_init( Constraints* _THIS,
int _n /**< Number of constraints. */
);
/** Initially adds number of a new (i.e. not yet in the list) constraint to
* a given index set.
* \return SUCCESSFUL_RETURN \n
RET_SETUP_CONSTRAINT_FAILED \n
RET_INDEX_OUT_OF_BOUNDS \n
RET_INVALID_ARGUMENTS */
returnValue Constraints_setupConstraint( Constraints* _THIS,
int number, /**< Number of new constraint. */
SubjectToStatus _status /**< Status of new constraint. */
);
/** Initially adds all enabled numbers of new (i.e. not yet in the list) constraints to
* to the index set of inactive constraints; the order depends on the SujectToType
* of each index. Only disabled constraints are added to index set of disabled constraints!
* \return SUCCESSFUL_RETURN \n
RET_SETUP_CONSTRAINT_FAILED */
returnValue Constraints_setupAllInactive( Constraints* _THIS
);
/** Initially adds all enabled numbers of new (i.e. not yet in the list) constraints to
* to the index set of active constraints (on their lower bounds); the order depends on the SujectToType
* of each index. Only disabled constraints are added to index set of disabled constraints!
* \return SUCCESSFUL_RETURN \n
RET_SETUP_CONSTRAINT_FAILED */
returnValue Constraints_setupAllLower( Constraints* _THIS
);
/** Initially adds all enabled numbers of new (i.e. not yet in the list) constraints to
* to the index set of active constraints (on their upper bounds); the order depends on the SujectToType
* of each index. Only disabled constraints are added to index set of disabled constraints!
* \return SUCCESSFUL_RETURN \n
RET_SETUP_CONSTRAINT_FAILED */
returnValue Constraints_setupAllUpper( Constraints* _THIS
);
/** Moves index of a constraint from index list of active to that of inactive constraints.
* \return SUCCESSFUL_RETURN \n
RET_MOVING_CONSTRAINT_FAILED */
returnValue Constraints_moveActiveToInactive( Constraints* _THIS,
int number /**< Number of constraint to become inactive. */
);
/** Moves index of a constraint from index list of inactive to that of active constraints.
* \return SUCCESSFUL_RETURN \n
RET_MOVING_CONSTRAINT_FAILED */
returnValue Constraints_moveInactiveToActive( Constraints* _THIS,
int number, /**< Number of constraint to become active. */
SubjectToStatus _status /**< Status of constraint to become active. */
);
/** Flip fixed constraint.
* \return SUCCESSFUL_RETURN \n
RET_MOVING_CONSTRAINT_FAILED \n
RET_INDEX_OUT_OF_BOUNDS */
returnValue Constraints_flipFixed( Constraints* _THIS,
int number
);
/** Returns the number of constraints.
* \return Number of constraints. */
static inline int Constraints_getNC( Constraints* _THIS
);
/** Returns the number of implicit equality constraints.
* \return Number of implicit equality constraints. */
static inline int Constraints_getNEC( Constraints* _THIS
);
/** Returns the number of "real" inequality constraints.
* \return Number of "real" inequality constraints. */
static inline int Constraints_getNIC( Constraints* _THIS
);
/** Returns the number of unbounded constraints (i.e. without any bounds).
* \return Number of unbounded constraints (i.e. without any bounds). */
static inline int Constraints_getNUC( Constraints* _THIS
);
/** Returns the number of active constraints.
* \return Number of active constraints. */
static inline int Constraints_getNAC( Constraints* _THIS
);
/** Returns the number of inactive constraints.
* \return Number of inactive constraints. */
static inline int Constraints_getNIAC( Constraints* _THIS
);
/** Returns a pointer to active constraints index list.
* \return Pointer to active constraints index list. */
static inline Indexlist* Constraints_getActive( Constraints* _THIS
);
/** Returns a pointer to inactive constraints index list.
* \return Pointer to inactive constraints index list. */
static inline Indexlist* Constraints_getInactive( Constraints* _THIS
);
/** Returns number of constraints with given SubjectTo type.
* \return Number of constraints with given type. */
static inline int Constraints_getNumberOfType( Constraints* _THIS,
SubjectToType _type /**< Type of constraints' bound. */
);
/** Returns type of constraints' bound.
* \return Type of constraints' bound \n
RET_INDEX_OUT_OF_BOUNDS */
static inline SubjectToType Constraints_getType( Constraints* _THIS,
int i /**< Number of constraints' bound. */
);
/** Returns status of constraints' bound.
* \return Status of constraints' bound \n
ST_UNDEFINED */
static inline SubjectToStatus Constraints_getStatus( Constraints* _THIS,
int i /**< Number of constraints' bound. */
);
/** Sets type of constraints' bound.
* \return SUCCESSFUL_RETURN \n
RET_INDEX_OUT_OF_BOUNDS */
static inline returnValue Constraints_setType( Constraints* _THIS,
int i, /**< Number of constraints' bound. */
SubjectToType value /**< Type of constraints' bound. */
);
/** Sets status of constraints' bound.
* \return SUCCESSFUL_RETURN \n
RET_INDEX_OUT_OF_BOUNDS */
static inline returnValue Constraints_setStatus( Constraints* _THIS,
int i, /**< Number of constraints' bound. */
SubjectToStatus value /**< Status of constraints' bound. */
);
/** Sets status of lower constraints' bounds. */
static inline void Constraints_setNoLower( Constraints* _THIS,
BooleanType _status /**< Status of lower constraints' bounds. */
);
/** Sets status of upper constraints' bounds. */
static inline void Constraints_setNoUpper( Constraints* _THIS,
BooleanType _status /**< Status of upper constraints' bounds. */
);
/** Returns status of lower constraints' bounds.
* \return BT_TRUE if there is no lower constraints' bound on any variable. */
static inline BooleanType Constraints_hasNoLower( Constraints* _THIS
);
/** Returns status of upper bounds.
* \return BT_TRUE if there is no upper constraints' bound on any variable. */
static inline BooleanType Constraints_hasNoUpper( Constraints* _THIS
);
/** Shifts forward type and status of all constraints 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 constraints n.
* Type and status of the first \<offset\> constraints is thrown away,
* type and status of the last \<offset\> constraints is doubled,
* e.g. for offset = 2: \n
* shift( {c/b1,c/b2,c/b3,c/b4,c/b5,c/b6} ) = {c/b3,c/b4,c/b5,c/b6,c/b5,c/b6}
* \return SUCCESSFUL_RETURN \n
RET_INDEX_OUT_OF_BOUNDS \n
RET_INVALID_ARGUMENTS \n
RET_SHIFTING_FAILED */
returnValue Constraints_shift( Constraints* _THIS,
int offset /**< Shift offset within the range [0,n/2] and integer divisor of n. */
);
/** Rotates forward type and status of all constraints by a given
* offset. This offset has to lie within the range [0,n].
* Example for offset = 2: \n
* rotate( {c1,c2,c3,c4,c5,c6} ) = {c3,c4,c5,c6,c1,c2}
* \return SUCCESSFUL_RETURN \n
RET_INDEX_OUT_OF_BOUNDS \n
RET_ROTATING_FAILED */
returnValue Constraints_rotate( Constraints* _THIS,
int offset /**< Rotation offset within the range [0,n]. */
);
/** Prints information on constraints object
* (in particular, lists of inactive and active constraints.
* \return SUCCESSFUL_RETURN \n
RET_INDEXLIST_CORRUPTED */
returnValue Constraints_print( Constraints* _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_CONSTRAINT_FAILED */
returnValue Constraints_setupAll( Constraints* _THIS,
SubjectToStatus _status /**< Desired initial status for all bounds. */
);
/** Adds the index of a new constraint to index set.
* \return SUCCESSFUL_RETURN \n
RET_ADDINDEX_FAILED \n
RET_INVALID_ARGUMENTS */
returnValue Constraints_addIndex( Constraints* _THIS,
Indexlist* const indexlist, /**< Index list to which the new index shall be added. */
int newnumber, /**< Number of new constraint. */
SubjectToStatus newstatus /**< Status of new constraint. */
);
/** Removes the index of a constraint from index set.
* \return SUCCESSFUL_RETURN \n
RET_REMOVEINDEX_FAILED \n
RET_INVALID_ARGUMENTS */
returnValue Constraints_removeIndex( Constraints* _THIS,
Indexlist* const indexlist, /**< Index list from which the new index shall be removed. */
int removenumber /**< Number of constraint 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 Constraints_swapIndex( Constraints* _THIS,
Indexlist* const indexlist, /**< Index list in which the indices shold be swapped. */
int number1, /**< Number of first constraint. */
int number2 /**< Number of second constraint. */
);
/*
* g e t N u m b e r O f T y p e
*/
static inline int Constraints_getNumberOfType( Constraints* _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 Constraints_getType( Constraints* _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 Constraints_getStatus( Constraints* _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 Constraints_setType( Constraints* _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 Constraints_setStatus( Constraints* _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 Constraints_setNoLower( Constraints* _THIS, BooleanType _status )
{
_THIS->noLower = _status;
}
/*
* s e t N o U p p e r
*/
static inline void Constraints_setNoUpper( Constraints* _THIS, BooleanType _status )
{
_THIS->noUpper = _status;
}
/*
* h a s N o L o w e r
*/
static inline BooleanType Constraints_hasNoLower( Constraints* _THIS )
{
return _THIS->noLower;
}
/*
* h a s N o U p p p e r
*/
static inline BooleanType Constraints_hasNoUpper( Constraints* _THIS )
{
return _THIS->noUpper;
}
/*
* g e t N C
*/
static inline int Constraints_getNC( Constraints* _THIS )
{
return _THIS->n;
}
/*
* g e t N E C
*/
static inline int Constraints_getNEC( Constraints* _THIS )
{
return Constraints_getNumberOfType( _THIS,ST_EQUALITY );
}
/*
* g e t N I C
*/
static inline int Constraints_getNIC( Constraints* _THIS )
{
return Constraints_getNumberOfType( _THIS,ST_BOUNDED );
}
/*
* g e t N U C
*/
static inline int Constraints_getNUC( Constraints* _THIS )
{
return Constraints_getNumberOfType( _THIS,ST_UNBOUNDED );
}
/*
* g e t N A C
*/
static inline int Constraints_getNAC( Constraints* _THIS )
{
return Indexlist_getLength( _THIS->active );
}
/*
* g e t N I A C
*/
static inline int Constraints_getNIAC( Constraints* _THIS )
{
return Indexlist_getLength( _THIS->inactive );
}
/*
* g e t A c t i v e
*/
static inline Indexlist* Constraints_getActive( Constraints* _THIS )
{
return _THIS->active;
}
/*
* g e t I n a c t i v e
*/
static inline Indexlist* Constraints_getInactive( Constraints* _THIS )
{
return _THIS->inactive;
}
END_NAMESPACE_QPOASES
#endif /* QPOASES_CONSTRAINTS_H */
/*
* end of file
*/