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.
252 lines
5.8 KiB
252 lines
5.8 KiB
/*
|
|
* This file is part of qpOASES.
|
|
*
|
|
* qpOASES -- An Implementation of the Online Active Set Strategy.
|
|
* Copyright (C) 2007-2008 by Hans Joachim Ferreau 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 SRC/Bounds.cpp
|
|
* \author Hans Joachim Ferreau
|
|
* \version 1.3embedded
|
|
* \date 2007-2008
|
|
*
|
|
* Implementation of the Bounds class designed to manage working sets of
|
|
* bounds within a QProblem.
|
|
*/
|
|
|
|
|
|
#include <Bounds.hpp>
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
* P U B L I C *
|
|
*****************************************************************************/
|
|
|
|
|
|
/*
|
|
* B o u n d s
|
|
*/
|
|
Bounds::Bounds( ) : SubjectTo( ),
|
|
nV( 0 ),
|
|
nFV( 0 ),
|
|
nBV( 0 ),
|
|
nUV( 0 )
|
|
{
|
|
}
|
|
|
|
|
|
/*
|
|
* B o u n d s
|
|
*/
|
|
Bounds::Bounds( const Bounds& rhs ) : SubjectTo( rhs ),
|
|
nV( rhs.nV ),
|
|
nFV( rhs.nFV ),
|
|
nBV( rhs.nBV ),
|
|
nUV( rhs.nUV )
|
|
{
|
|
free = rhs.free;
|
|
fixed = rhs.fixed;
|
|
}
|
|
|
|
|
|
/*
|
|
* ~ B o u n d s
|
|
*/
|
|
Bounds::~Bounds( )
|
|
{
|
|
}
|
|
|
|
|
|
/*
|
|
* o p e r a t o r =
|
|
*/
|
|
Bounds& Bounds::operator=( const Bounds& rhs )
|
|
{
|
|
if ( this != &rhs )
|
|
{
|
|
SubjectTo::operator=( rhs );
|
|
|
|
nV = rhs.nV;
|
|
nFV = rhs.nFV;
|
|
nBV = rhs.nBV;
|
|
nUV = rhs.nUV;
|
|
|
|
free = rhs.free;
|
|
fixed = rhs.fixed;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
|
|
/*
|
|
* i n i t
|
|
*/
|
|
returnValue Bounds::init( int n )
|
|
{
|
|
nV = n;
|
|
nFV = 0;
|
|
nBV = 0;
|
|
nUV = 0;
|
|
|
|
free.init( );
|
|
fixed.init( );
|
|
|
|
return SubjectTo::init( n );
|
|
}
|
|
|
|
|
|
/*
|
|
* s e t u p B o u n d
|
|
*/
|
|
returnValue Bounds::setupBound( int _number, SubjectToStatus _status
|
|
)
|
|
{
|
|
/* consistency check */
|
|
if ( ( _number < 0 ) || ( _number >= getNV( ) ) )
|
|
return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
|
|
|
|
/* Add bound index to respective index list. */
|
|
switch ( _status )
|
|
{
|
|
case ST_INACTIVE:
|
|
if ( this->addIndex( this->getFree( ),_number,_status ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_SETUP_BOUND_FAILED );
|
|
break;
|
|
|
|
case ST_LOWER:
|
|
if ( this->addIndex( this->getFixed( ),_number,_status ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_SETUP_BOUND_FAILED );
|
|
break;
|
|
|
|
case ST_UPPER:
|
|
if ( this->addIndex( this->getFixed( ),_number,_status ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_SETUP_BOUND_FAILED );
|
|
break;
|
|
|
|
default:
|
|
return THROWERROR( RET_INVALID_ARGUMENTS );
|
|
}
|
|
|
|
return SUCCESSFUL_RETURN;
|
|
}
|
|
|
|
|
|
/*
|
|
* s e t u p A l l F r e e
|
|
*/
|
|
returnValue Bounds::setupAllFree( )
|
|
{
|
|
int i;
|
|
|
|
/* 1) Place unbounded variables at the beginning of the index list of free variables. */
|
|
for( i=0; i<nV; ++i )
|
|
{
|
|
if ( getType( i ) == ST_UNBOUNDED )
|
|
{
|
|
if ( setupBound( i,ST_INACTIVE ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_SETUP_BOUND_FAILED );
|
|
}
|
|
}
|
|
|
|
/* 2) Add remaining (i.e. bounded but possibly free) variables to the index list of free variables. */
|
|
for( i=0; i<nV; ++i )
|
|
{
|
|
if ( getType( i ) == ST_BOUNDED )
|
|
{
|
|
if ( setupBound( i,ST_INACTIVE ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_SETUP_BOUND_FAILED );
|
|
}
|
|
}
|
|
|
|
/* 3) Place implicitly fixed variables at the end of the index list of free variables. */
|
|
for( i=0; i<nV; ++i )
|
|
{
|
|
if ( getType( i ) == ST_EQUALITY )
|
|
{
|
|
if ( setupBound( i,ST_INACTIVE ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_SETUP_BOUND_FAILED );
|
|
}
|
|
}
|
|
|
|
return SUCCESSFUL_RETURN;
|
|
}
|
|
|
|
|
|
/*
|
|
* m o v e F i x e d T o F r e e
|
|
*/
|
|
returnValue Bounds::moveFixedToFree( int _number )
|
|
{
|
|
/* consistency check */
|
|
if ( ( _number < 0 ) || ( _number >= getNV( ) ) )
|
|
return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
|
|
|
|
/* Move index from indexlist of fixed variables to that of free ones. */
|
|
if ( this->removeIndex( this->getFixed( ),_number ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_MOVING_BOUND_FAILED );
|
|
|
|
if ( this->addIndex( this->getFree( ),_number,ST_INACTIVE ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_MOVING_BOUND_FAILED );
|
|
|
|
return SUCCESSFUL_RETURN;
|
|
}
|
|
|
|
|
|
/*
|
|
* m o v e F r e e T o F i x e d
|
|
*/
|
|
returnValue Bounds::moveFreeToFixed( int _number, SubjectToStatus _status
|
|
)
|
|
{
|
|
/* consistency check */
|
|
if ( ( _number < 0 ) || ( _number >= getNV( ) ) )
|
|
return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
|
|
|
|
/* Move index from indexlist of free variables to that of fixed ones. */
|
|
if ( this->removeIndex( this->getFree( ),_number ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_MOVING_BOUND_FAILED );
|
|
|
|
if ( this->addIndex( this->getFixed( ),_number,_status ) != SUCCESSFUL_RETURN )
|
|
return THROWERROR( RET_MOVING_BOUND_FAILED );
|
|
|
|
return SUCCESSFUL_RETURN;
|
|
}
|
|
|
|
|
|
/*
|
|
* s w a p F r e e
|
|
*/
|
|
returnValue Bounds::swapFree( int number1, int number2
|
|
)
|
|
{
|
|
/* consistency check */
|
|
if ( ( number1 < 0 ) || ( number1 >= getNV( ) ) || ( number2 < 0 ) || ( number2 >= getNV( ) ) )
|
|
return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
|
|
|
|
/* Swap index within indexlist of free variables. */
|
|
return this->swapIndex( this->getFree( ),number1,number2 );
|
|
}
|
|
|
|
|
|
/*
|
|
* end of file
|
|
*/
|
|
|