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
							 | 
						||
| 
								 | 
							
								 */
							 |