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.
		
		
		
		
			
				
					426 lines
				
				6.7 KiB
			
		
		
			
		
	
	
					426 lines
				
				6.7 KiB
			| 
											6 years ago
										 | /*
 | ||
|  |  *	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/QProblemB.ipp
 | ||
|  |  *	\author Hans Joachim Ferreau
 | ||
|  |  *	\version 1.3embedded
 | ||
|  |  *	\date 2007-2008
 | ||
|  |  *
 | ||
|  |  *	Implementation of inlined member functions of the QProblemB class which 
 | ||
|  |  *	is able to use the newly developed online active set strategy for 
 | ||
|  |  *	parametric quadratic programming.
 | ||
|  |  */
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #include <math.h>
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*****************************************************************************
 | ||
|  |  *  P U B L I C                                                              *
 | ||
|  |  *****************************************************************************/
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t H
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::getH( real_t* const _H ) const
 | ||
|  | {
 | ||
|  | 	int i;
 | ||
|  | 
 | ||
|  | 	for ( i=0; i<getNV( )*getNV( ); ++i )
 | ||
|  | 		_H[i] = H[i];
 | ||
|  | 
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t G
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::getG( real_t* const _g ) const
 | ||
|  | {
 | ||
|  | 	int i;
 | ||
|  | 
 | ||
|  | 	for ( i=0; i<getNV( ); ++i )
 | ||
|  | 		_g[i] = g[i];
 | ||
|  | 
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t L B
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::getLB( real_t* const _lb ) const
 | ||
|  | {
 | ||
|  | 	int i;
 | ||
|  | 
 | ||
|  | 	for ( i=0; i<getNV( ); ++i )
 | ||
|  | 		_lb[i] = lb[i];
 | ||
|  | 
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t L B
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::getLB( int number, real_t& value ) const
 | ||
|  | {
 | ||
|  | 	if ( ( number >= 0 ) && ( number < getNV( ) ) )
 | ||
|  | 	{
 | ||
|  | 		value = lb[number];
 | ||
|  | 		return SUCCESSFUL_RETURN;
 | ||
|  | 	}
 | ||
|  | 	else
 | ||
|  | 	{
 | ||
|  | 		return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
 | ||
|  | 	}
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t U B
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::getUB( real_t* const _ub ) const
 | ||
|  | {
 | ||
|  | 	int i;
 | ||
|  | 
 | ||
|  | 	for ( i=0; i<getNV( ); ++i )
 | ||
|  | 		_ub[i] = ub[i];
 | ||
|  | 
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t U B
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::getUB( int number, real_t& value ) const
 | ||
|  | {
 | ||
|  | 	if ( ( number >= 0 ) && ( number < getNV( ) ) )
 | ||
|  | 	{
 | ||
|  | 		value = ub[number];
 | ||
|  | 		return SUCCESSFUL_RETURN;
 | ||
|  | 	}
 | ||
|  | 	else
 | ||
|  | 	{
 | ||
|  | 		return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
 | ||
|  | 	}
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t B o u n d s
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::getBounds( Bounds* const _bounds ) const
 | ||
|  | {
 | ||
|  | 	*_bounds = bounds;
 | ||
|  | 	
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t N V
 | ||
|  |  */
 | ||
|  | inline int QProblemB::getNV( ) const
 | ||
|  | {
 | ||
|  | 	return bounds.getNV( );
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t N F R
 | ||
|  |  */
 | ||
|  | inline int QProblemB::getNFR( )
 | ||
|  | {
 | ||
|  | 	return bounds.getNFR( );
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t N F X
 | ||
|  |  */
 | ||
|  | inline int QProblemB::getNFX( )
 | ||
|  | {
 | ||
|  | 	return bounds.getNFX( );
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t N F V
 | ||
|  |  */
 | ||
|  | inline int QProblemB::getNFV( ) const
 | ||
|  | {
 | ||
|  | 	return bounds.getNFV( );
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t S t a t u s
 | ||
|  |  */
 | ||
|  | inline QProblemStatus QProblemB::getStatus( ) const
 | ||
|  | {
 | ||
|  | 	return status;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	i s I n i t i a l i s e d
 | ||
|  |  */
 | ||
|  | inline BooleanType QProblemB::isInitialised( ) const
 | ||
|  | {
 | ||
|  | 	if ( status == QPS_NOTINITIALISED )
 | ||
|  | 		return BT_FALSE;
 | ||
|  | 	else
 | ||
|  | 		return BT_TRUE;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	i s S o l v e d
 | ||
|  |  */
 | ||
|  | inline BooleanType QProblemB::isSolved( ) const
 | ||
|  | {
 | ||
|  | 	if ( status == QPS_SOLVED )
 | ||
|  | 		return BT_TRUE;
 | ||
|  | 	else
 | ||
|  | 		return BT_FALSE;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	i s I n f e a s i b l e
 | ||
|  |  */
 | ||
|  | inline BooleanType QProblemB::isInfeasible( ) const
 | ||
|  | {
 | ||
|  | 	return infeasible;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	i s U n b o u n d e d
 | ||
|  |  */
 | ||
|  | inline BooleanType QProblemB::isUnbounded( ) const
 | ||
|  | {
 | ||
|  | 	return unbounded;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t P r i n t L e v e l
 | ||
|  |  */
 | ||
|  | inline PrintLevel QProblemB::getPrintLevel( ) const
 | ||
|  | {
 | ||
|  | 	return printlevel;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	g e t H e s s i a n T y p e
 | ||
|  |  */
 | ||
|  | inline HessianType QProblemB::getHessianType( ) const
 | ||
|  | {
 | ||
|  | 	return hessianType;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	s e t H e s s i a n T y p e
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::setHessianType( HessianType _hessianType )
 | ||
|  | {
 | ||
|  | 	hessianType = _hessianType;
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*****************************************************************************
 | ||
|  |  *  P R O T E C T E D                                                        *
 | ||
|  |  *****************************************************************************/
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	s e t H
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::setH( const real_t* const H_new )
 | ||
|  | {
 | ||
|  | 	int i, j;
 | ||
|  | 
 | ||
|  | 	int nV = getNV();
 | ||
|  | 
 | ||
|  | 	for( i=0; i<nV; ++i )
 | ||
|  | 		for( j=0; j<nV; ++j )
 | ||
|  | 			H[i*NVMAX + j] = H_new[i*nV + j];
 | ||
|  | 
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	s e t G
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::setG( const real_t* const g_new )
 | ||
|  | {
 | ||
|  | 	int i;
 | ||
|  | 
 | ||
|  | 	int nV = getNV();
 | ||
|  | 
 | ||
|  | 	for( i=0; i<nV; ++i )
 | ||
|  | 		g[i] = g_new[i];
 | ||
|  | 
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	s e t L B
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::setLB( const real_t* const lb_new )
 | ||
|  | {
 | ||
|  | 	int i;
 | ||
|  | 
 | ||
|  | 	int nV = getNV();
 | ||
|  | 
 | ||
|  | 	for( i=0; i<nV; ++i )
 | ||
|  | 		lb[i] = lb_new[i];
 | ||
|  | 
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	s e t L B
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::setLB( int number, real_t value )
 | ||
|  | {
 | ||
|  | 	if ( ( number >= 0 ) && ( number < getNV( ) ) )
 | ||
|  | 	{
 | ||
|  | 		lb[number] = value;
 | ||
|  | 		return SUCCESSFUL_RETURN;
 | ||
|  | 	}
 | ||
|  | 	else
 | ||
|  | 	{
 | ||
|  | 		return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
 | ||
|  | 	}
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	s e t U B
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::setUB( const real_t* const ub_new )
 | ||
|  | {
 | ||
|  | 	int i;
 | ||
|  | 
 | ||
|  | 	int nV = getNV();
 | ||
|  | 
 | ||
|  | 	for( i=0; i<nV; ++i )
 | ||
|  | 		ub[i] = ub_new[i];
 | ||
|  | 
 | ||
|  | 	return SUCCESSFUL_RETURN;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	s e t U B
 | ||
|  |  */
 | ||
|  | inline returnValue QProblemB::setUB( int number, real_t value )
 | ||
|  | {
 | ||
|  | 	if ( ( number >= 0 ) && ( number < getNV( ) ) )
 | ||
|  | 	{
 | ||
|  | 		ub[number] = value;
 | ||
|  | 
 | ||
|  | 		return SUCCESSFUL_RETURN;
 | ||
|  | 	}
 | ||
|  | 	else
 | ||
|  | 	{
 | ||
|  | 		return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
 | ||
|  | 	}
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	c o m p u t e G i v e n s
 | ||
|  |  */
 | ||
|  | inline void QProblemB::computeGivens(	real_t xold, real_t yold, real_t& xnew, real_t& ynew,
 | ||
|  | 										real_t& c, real_t& s 
 | ||
|  | 										) const
 | ||
|  | {
 | ||
|  |     if ( getAbs( yold ) <= ZERO )
 | ||
|  | 	{
 | ||
|  |         c = 1.0;
 | ||
|  |         s = 0.0;
 | ||
|  | 		
 | ||
|  | 		xnew = xold;
 | ||
|  | 		ynew = yold;
 | ||
|  | 	}
 | ||
|  |     else
 | ||
|  | 	{
 | ||
|  | 		real_t t, mu;
 | ||
|  | 
 | ||
|  |         mu = getAbs( xold );
 | ||
|  | 		if ( getAbs( yold ) > mu )
 | ||
|  | 			mu = getAbs( yold );
 | ||
|  | 		
 | ||
|  |         t = mu * sqrt( (xold/mu)*(xold/mu) + (yold/mu)*(yold/mu) );
 | ||
|  | 		
 | ||
|  | 		if ( xold < 0.0 )
 | ||
|  |             t = -t;
 | ||
|  | 		
 | ||
|  |         c = xold/t;
 | ||
|  |         s = yold/t;
 | ||
|  |         xnew = t;
 | ||
|  |         ynew = 0.0;
 | ||
|  | 	}
 | ||
|  | 	
 | ||
|  | 	return;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 		
 | ||
|  | /*
 | ||
|  |  *	a p p l y G i v e n s
 | ||
|  |  */
 | ||
|  | inline void QProblemB::applyGivens(	real_t c, real_t s, real_t xold, real_t yold,
 | ||
|  | 									real_t& xnew, real_t& ynew 
 | ||
|  | 									) const
 | ||
|  | {
 | ||
|  | 	/* Usual Givens plane rotation requiring four multiplications. */
 | ||
|  | 	xnew =  c*xold + s*yold;
 | ||
|  | 	ynew = -s*xold + c*yold;
 | ||
|  | // 	double nu = s/(1.0+c);
 | ||
|  | // 
 | ||
|  | // 	xnew = xold*c + yold*s;
 | ||
|  | // 	ynew = (xnew+xold)*nu - yold;
 | ||
|  | 	
 | ||
|  | 	return;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *	end of file
 | ||
|  |  */
 |