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.
		
		
		
		
			
				
					629 lines
				
				27 KiB
			
		
		
			
		
	
	
					629 lines
				
				27 KiB
			| 
								 
											8 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 INCLUDE/QProblemB.hpp
							 | 
						||
| 
								 | 
							
								 *	\author Hans Joachim Ferreau
							 | 
						||
| 
								 | 
							
								 *	\version 1.3embedded
							 | 
						||
| 
								 | 
							
								 *	\date 2007-2008
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *	Declaration of the QProblemB class which is able to use the newly
							 | 
						||
| 
								 | 
							
								 *	developed online active set strategy for parametric quadratic programming
							 | 
						||
| 
								 | 
							
								 *	for problems with (simple) bounds only.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef QPOASES_QPROBLEMB_HPP
							 | 
						||
| 
								 | 
							
								#define QPOASES_QPROBLEMB_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <Bounds.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SolutionAnalysis;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Class for setting up and solving quadratic programs with (simple) bounds only.
							 | 
						||
| 
								 | 
							
								 *	The main feature is the possibily to use the newly developed online active set strategy
							 | 
						||
| 
								 | 
							
								 *	for parametric quadratic programming.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *	\author Hans Joachim Ferreau
							 | 
						||
| 
								 | 
							
								 *	\version 1.3embedded
							 | 
						||
| 
								 | 
							
								 *	\date 2007-2008
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class QProblemB
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									/* allow SolutionAnalysis class to access private members */
							 | 
						||
| 
								 | 
							
									friend class SolutionAnalysis;
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									/*
							 | 
						||
| 
								 | 
							
									 *	PUBLIC MEMBER FUNCTIONS
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public:
							 | 
						||
| 
								 | 
							
										/** Default constructor. */
							 | 
						||
| 
								 | 
							
										QProblemB( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Constructor which takes the QP dimension only. */
							 | 
						||
| 
								 | 
							
										QProblemB(	int _nV						/**< Number of variables. */
							 | 
						||
| 
								 | 
							
													);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Copy constructor (deep copy). */
							 | 
						||
| 
								 | 
							
										QProblemB(	const QProblemB& rhs	/**< Rhs object. */
							 | 
						||
| 
								 | 
							
													);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Destructor. */
							 | 
						||
| 
								 | 
							
										~QProblemB( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Assignment operator (deep copy). */
							 | 
						||
| 
								 | 
							
										QProblemB& operator=(	const QProblemB& rhs	/**< Rhs object. */
							 | 
						||
| 
								 | 
							
																);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Clears all data structures of QProblemB except for QP data.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_RESET_FAILED */
							 | 
						||
| 
								 | 
							
										returnValue reset( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Initialises a QProblemB with given QP data and solves it
							 | 
						||
| 
								 | 
							
										 *	using an initial homotopy with empty working set (at most nWSR iterations).
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_CHOLESKY \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_HOTSTART \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_INFEASIBILITY \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_UNBOUNDEDNESS \n
							 | 
						||
| 
								 | 
							
													RET_MAX_NWSR_REACHED \n
							 | 
						||
| 
								 | 
							
													RET_INVALID_ARGUMENTS \n
							 | 
						||
| 
								 | 
							
													RET_INACCURATE_SOLUTION \n
							 | 
						||
| 
								 | 
							
										 			RET_NO_SOLUTION */
							 | 
						||
| 
								 | 
							
										returnValue init(	const real_t* const _H, 		/**< Hessian matrix. */
							 | 
						||
| 
								 | 
							
															const real_t* const _g,			/**< Gradient vector. */
							 | 
						||
| 
								 | 
							
															const real_t* const _lb,		/**< Lower bounds (on variables). \n
							 | 
						||
| 
								 | 
							
																								If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _ub,		/**< Upper bounds (on variables). \n
							 | 
						||
| 
								 | 
							
																								If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															int& nWSR, 						/**< Input: Maximum number of working set recalculations when using initial homotopy. \n
							 | 
						||
| 
								 | 
							
																								Output: Number of performed working set recalculations. */
							 | 
						||
| 
								 | 
							
															const real_t* const yOpt = 0,	/**< Initial guess for dual solution vector. */
							 | 
						||
| 
								 | 
							
												 			real_t* const cputime = 0		/**< Output: CPU time required to initialise QP. */
							 | 
						||
| 
								 | 
							
															);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Initialises a QProblemB with given QP data and solves it
							 | 
						||
| 
								 | 
							
										 *	using an initial homotopy with empty working set (at most nWSR iterations).
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_CHOLESKY \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_HOTSTART \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_INFEASIBILITY \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_UNBOUNDEDNESS \n
							 | 
						||
| 
								 | 
							
													RET_MAX_NWSR_REACHED \n
							 | 
						||
| 
								 | 
							
													RET_INVALID_ARGUMENTS \n
							 | 
						||
| 
								 | 
							
													RET_INACCURATE_SOLUTION \n
							 | 
						||
| 
								 | 
							
										 			RET_NO_SOLUTION */
							 | 
						||
| 
								 | 
							
										returnValue init(	const real_t* const _H, 		/**< Hessian matrix. */
							 | 
						||
| 
								 | 
							
															const real_t* const _R, 		/**< Cholesky factorization of the Hessian matrix. */
							 | 
						||
| 
								 | 
							
															const real_t* const _g,			/**< Gradient vector. */
							 | 
						||
| 
								 | 
							
															const real_t* const _lb,		/**< Lower bounds (on variables). \n
							 | 
						||
| 
								 | 
							
																								If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _ub,		/**< Upper bounds (on variables). \n
							 | 
						||
| 
								 | 
							
																								If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															int& nWSR, 						/**< Input: Maximum number of working set recalculations when using initial homotopy. \n
							 | 
						||
| 
								 | 
							
																								Output: Number of performed working set recalculations. */
							 | 
						||
| 
								 | 
							
															const real_t* const yOpt = 0,	/**< Initial guess for dual solution vector. */
							 | 
						||
| 
								 | 
							
												 			real_t* const cputime = 0		/**< Output: CPU time required to initialise QP. */
							 | 
						||
| 
								 | 
							
															);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Solves an initialised QProblemB using online active set strategy.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_MAX_NWSR_REACHED \n
							 | 
						||
| 
								 | 
							
													RET_HOTSTART_FAILED_AS_QP_NOT_INITIALISED \n
							 | 
						||
| 
								 | 
							
													RET_HOTSTART_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_SHIFT_DETERMINATION_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_STEPDIRECTION_DETERMINATION_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_STEPLENGTH_DETERMINATION_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_HOMOTOPY_STEP_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_HOTSTART_STOPPED_INFEASIBILITY \n
							 | 
						||
| 
								 | 
							
													RET_HOTSTART_STOPPED_UNBOUNDEDNESS \n
							 | 
						||
| 
								 | 
							
													RET_INACCURATE_SOLUTION \n
							 | 
						||
| 
								 | 
							
										 			RET_NO_SOLUTION */
							 | 
						||
| 
								 | 
							
										returnValue hotstart(	const real_t* const g_new,	/**< Gradient of neighbouring QP to be solved. */
							 | 
						||
| 
								 | 
							
																const real_t* const lb_new,	/**< Lower bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																					 			 If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const real_t* const ub_new,	/**< Upper bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																					 			 If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																int& nWSR,					/**< Input: Maximum number of working set recalculations; \n
							 | 
						||
| 
								 | 
							
																								 Output: Number of performed working set recalculations. */
							 | 
						||
| 
								 | 
							
																real_t* const cputime		/**< Output: CPU time required to solve QP (or to perform nWSR iterations). */
							 | 
						||
| 
								 | 
							
																);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns Hessian matrix of the QP (deep copy).
							 | 
						||
| 
								 | 
							
										  *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue getH(	real_t* const _H	/**< Array of appropriate dimension for copying Hessian matrix.*/
							 | 
						||
| 
								 | 
							
																	) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns gradient vector of the QP (deep copy).
							 | 
						||
| 
								 | 
							
										  *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue getG(	real_t* const _g	/**< Array of appropriate dimension for copying gradient vector.*/
							 | 
						||
| 
								 | 
							
																	) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns lower bound vector of the QP (deep copy).
							 | 
						||
| 
								 | 
							
										  *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue getLB(	real_t* const _lb	/**< Array of appropriate dimension for copying lower bound vector.*/
							 | 
						||
| 
								 | 
							
																	) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns single entry of lower bound vector of the QP.
							 | 
						||
| 
								 | 
							
										  *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_INDEX_OUT_OF_BOUNDS */
							 | 
						||
| 
								 | 
							
										inline returnValue getLB(	int number,		/**< Number of entry to be returned. */
							 | 
						||
| 
								 | 
							
																	real_t& value	/**< Output: lb[number].*/
							 | 
						||
| 
								 | 
							
																	) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns upper bound vector of the QP (deep copy).
							 | 
						||
| 
								 | 
							
										  *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue getUB(	real_t* const _ub	/**< Array of appropriate dimension for copying upper bound vector.*/
							 | 
						||
| 
								 | 
							
																	) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns single entry of upper bound vector of the QP.
							 | 
						||
| 
								 | 
							
										  *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_INDEX_OUT_OF_BOUNDS */
							 | 
						||
| 
								 | 
							
										inline returnValue getUB(	int number,		/**< Number of entry to be returned. */
							 | 
						||
| 
								 | 
							
																	real_t& value	/**< Output: ub[number].*/
							 | 
						||
| 
								 | 
							
																	) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns current bounds object of the QP (deep copy).
							 | 
						||
| 
								 | 
							
										  *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue getBounds(	Bounds* const _bounds	/** Output: Bounds object. */
							 | 
						||
| 
								 | 
							
																		) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the number of variables.
							 | 
						||
| 
								 | 
							
										 *	\return Number of variables. */
							 | 
						||
| 
								 | 
							
										inline int getNV( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the number of free variables.
							 | 
						||
| 
								 | 
							
										 *	\return Number of free variables. */
							 | 
						||
| 
								 | 
							
										inline int getNFR( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the number of fixed variables.
							 | 
						||
| 
								 | 
							
										 *	\return Number of fixed variables. */
							 | 
						||
| 
								 | 
							
										inline int getNFX( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the number of implicitly fixed variables.
							 | 
						||
| 
								 | 
							
										 *	\return Number of implicitly fixed variables. */
							 | 
						||
| 
								 | 
							
										inline int getNFV( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the dimension of null space.
							 | 
						||
| 
								 | 
							
										 *	\return Dimension of null space. */
							 | 
						||
| 
								 | 
							
										int getNZ( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the optimal objective function value.
							 | 
						||
| 
								 | 
							
										 *	\return finite value: Optimal objective function value (QP was solved) \n
							 | 
						||
| 
								 | 
							
										 			+infinity:	  QP was not yet solved */
							 | 
						||
| 
								 | 
							
										real_t getObjVal( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the objective function value at an arbitrary point x.
							 | 
						||
| 
								 | 
							
										 *	\return Objective function value at point x */
							 | 
						||
| 
								 | 
							
										real_t getObjVal(	const real_t* const _x	/**< Point at which the objective function shall be evaluated. */
							 | 
						||
| 
								 | 
							
															) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the primal solution vector.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_QP_NOT_SOLVED */
							 | 
						||
| 
								 | 
							
										returnValue getPrimalSolution(	real_t* const xOpt			/**< Output: Primal solution vector (if QP has been solved). */
							 | 
						||
| 
								 | 
							
																		) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the dual solution vector.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_QP_NOT_SOLVED */
							 | 
						||
| 
								 | 
							
										returnValue getDualSolution(	real_t* const yOpt	/**< Output: Dual solution vector (if QP has been solved). */
							 | 
						||
| 
								 | 
							
																		) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns status of the solution process.
							 | 
						||
| 
								 | 
							
										 *	\return Status of solution process. */
							 | 
						||
| 
								 | 
							
										inline QProblemStatus getStatus( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns if the QProblem object is initialised.
							 | 
						||
| 
								 | 
							
										 *	\return BT_TRUE:  QProblemB initialised \n
							 | 
						||
| 
								 | 
							
										 			BT_FALSE: QProblemB not initialised */
							 | 
						||
| 
								 | 
							
										inline BooleanType isInitialised( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns if the QP has been solved.
							 | 
						||
| 
								 | 
							
										 *	\return BT_TRUE:  QProblemB solved \n
							 | 
						||
| 
								 | 
							
										 			BT_FALSE: QProblemB not solved */
							 | 
						||
| 
								 | 
							
										inline BooleanType isSolved( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns if the QP is infeasible.
							 | 
						||
| 
								 | 
							
										 *	\return BT_TRUE:  QP infeasible \n
							 | 
						||
| 
								 | 
							
										 			BT_FALSE: QP feasible (or not known to be infeasible!) */
							 | 
						||
| 
								 | 
							
										inline BooleanType isInfeasible( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns if the QP is unbounded.
							 | 
						||
| 
								 | 
							
										 *	\return BT_TRUE:  QP unbounded \n
							 | 
						||
| 
								 | 
							
										 			BT_FALSE: QP unbounded (or not known to be unbounded!) */
							 | 
						||
| 
								 | 
							
										inline BooleanType isUnbounded( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns the print level.
							 | 
						||
| 
								 | 
							
										 *	\return Print level. */
							 | 
						||
| 
								 | 
							
										inline PrintLevel getPrintLevel( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Changes the print level.
							 | 
						||
| 
								 | 
							
								 		 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										returnValue setPrintLevel(	PrintLevel _printlevel	/**< New print level. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Returns Hessian type flag (type is not determined due to this call!).
							 | 
						||
| 
								 | 
							
										 *	\return Hessian type. */
							 | 
						||
| 
								 | 
							
										inline HessianType getHessianType( ) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Changes the print level.
							 | 
						||
| 
								 | 
							
								 		 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue setHessianType(	HessianType _hessianType /**< New Hessian type. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*
							 | 
						||
| 
								 | 
							
									 *	PROTECTED MEMBER FUNCTIONS
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									protected:
							 | 
						||
| 
								 | 
							
										/** Checks if Hessian happens to be the identity matrix,
							 | 
						||
| 
								 | 
							
										 *  and sets corresponding status flag (otherwise the flag remains unaltered!).
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										returnValue checkForIdentityHessian( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Determines type of constraints and bounds (i.e. implicitly fixed, unbounded etc.).
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_SETUPSUBJECTTOTYPE_FAILED */
							 | 
						||
| 
								 | 
							
										returnValue setupSubjectToType( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Computes the Cholesky decomposition R of the (simply projected) Hessian (i.e. R^T*R = Z^T*H*Z).
							 | 
						||
| 
								 | 
							
										 *  It only works in the case where Z is a simple projection matrix!
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
										 *			RET_INDEXLIST_CORRUPTED */
							 | 
						||
| 
								 | 
							
										returnValue setupCholeskyDecomposition( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Solves a QProblemB whose QP data is assumed to be stored in the member variables.
							 | 
						||
| 
								 | 
							
										 *  A guess for its primal/dual optimal solution vectors and the corresponding
							 | 
						||
| 
								 | 
							
										 *  optimal working set can be provided.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_CHOLESKY \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_HOTSTART \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_INFEASIBILITY \n
							 | 
						||
| 
								 | 
							
													RET_INIT_FAILED_UNBOUNDEDNESS \n
							 | 
						||
| 
								 | 
							
													RET_MAX_NWSR_REACHED */
							 | 
						||
| 
								 | 
							
										returnValue solveInitialQP(	const real_t* const xOpt,			/**< Optimal primal solution vector.
							 | 
						||
| 
								 | 
							
																										 *	 A NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const real_t* const yOpt,			/**< Optimal dual solution vector.
							 | 
						||
| 
								 | 
							
																										 *	 A NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const Bounds* const guessedBounds,	/**< Guessed working set for solution (xOpt,yOpt).
							 | 
						||
| 
								 | 
							
																										 *	 A NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	int& nWSR, 							/**< Input: Maximum number of working set recalculations; \n
							 | 
						||
| 
								 | 
							
																								 		 *	 Output: Number of performed working set recalculations. */
							 | 
						||
| 
								 | 
							
																	real_t* const cputime				/**< Output: CPU time required to solve QP (or to perform nWSR iterations). */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Obtains the desired working set for the auxiliary initial QP in
							 | 
						||
| 
								 | 
							
										 *  accordance with the user specifications
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_OBTAINING_WORKINGSET_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
										returnValue obtainAuxiliaryWorkingSet(	const real_t* const xOpt,			/**< Optimal primal solution vector.
							 | 
						||
| 
								 | 
							
																													 *	 If a NULL pointer is passed, all entries are assumed to be zero. */
							 | 
						||
| 
								 | 
							
																				const real_t* const yOpt,			/**< Optimal dual solution vector.
							 | 
						||
| 
								 | 
							
																													 *	 If a NULL pointer is passed, all entries are assumed to be zero. */
							 | 
						||
| 
								 | 
							
																				const Bounds* const guessedBounds,	/**< Guessed working set for solution (xOpt,yOpt). */
							 | 
						||
| 
								 | 
							
																				Bounds* auxiliaryBounds				/**< Input: Allocated bound object. \n
							 | 
						||
| 
								 | 
							
																													 *	 Ouput: Working set for auxiliary QP. */
							 | 
						||
| 
								 | 
							
																				) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Setups bound data structure according to auxiliaryBounds.
							 | 
						||
| 
								 | 
							
										 *  (If the working set shall be setup afresh, make sure that
							 | 
						||
| 
								 | 
							
										 *  bounds data structure has been resetted!)
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_SETUP_WORKINGSET_FAILED \n
							 | 
						||
| 
								 | 
							
													RET_INVALID_ARGUMENTS \n
							 | 
						||
| 
								 | 
							
													RET_UNKNOWN BUG */
							 | 
						||
| 
								 | 
							
										returnValue setupAuxiliaryWorkingSet(	const Bounds* const auxiliaryBounds,	/**< Working set for auxiliary QP. */
							 | 
						||
| 
								 | 
							
																				BooleanType setupAfresh					/**< Flag indicating if given working set shall be
							 | 
						||
| 
								 | 
							
																														 *    setup afresh or by updating the current one. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Setups the optimal primal/dual solution of the auxiliary initial QP.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										returnValue setupAuxiliaryQPsolution(	const real_t* const xOpt,			/**< Optimal primal solution vector.
							 | 
						||
| 
								 | 
							
																												 	*	 If a NULL pointer is passed, all entries are set to zero. */
							 | 
						||
| 
								 | 
							
																				const real_t* const yOpt			/**< Optimal dual solution vector.
							 | 
						||
| 
								 | 
							
																													 *	 If a NULL pointer is passed, all entries are set to zero. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Setups gradient of the auxiliary initial QP for given
							 | 
						||
| 
								 | 
							
										 *  optimal primal/dual solution and given initial working set
							 | 
						||
| 
								 | 
							
										 *  (assumes that members X, Y and BOUNDS have already been initialised!).
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										returnValue setupAuxiliaryQPgradient( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Setups bounds of the auxiliary initial QP for given
							 | 
						||
| 
								 | 
							
										 *  optimal primal/dual solution and given initial working set
							 | 
						||
| 
								 | 
							
										 *  (assumes that members X, Y and BOUNDS have already been initialised!).
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_UNKNOWN BUG */
							 | 
						||
| 
								 | 
							
										returnValue setupAuxiliaryQPbounds( BooleanType useRelaxation	/**< Flag indicating if inactive bounds shall be relaxed. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Adds a bound to active set (specialised version for the case where no constraints exist).
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
										 			RET_ADDBOUND_FAILED */
							 | 
						||
| 
								 | 
							
										returnValue addBound(	int number,					/**< Number of bound to be added to active set. */
							 | 
						||
| 
								 | 
							
																SubjectToStatus B_status,	/**< Status of new active bound. */
							 | 
						||
| 
								 | 
							
																BooleanType updateCholesky	/**< Flag indicating if Cholesky decomposition shall be updated. */
							 | 
						||
| 
								 | 
							
																);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Removes a bounds from active set (specialised version for the case where no constraints exist).
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_HESSIAN_NOT_SPD \n
							 | 
						||
| 
								 | 
							
													RET_REMOVEBOUND_FAILED */
							 | 
						||
| 
								 | 
							
										returnValue removeBound(	int number,					/**< Number of bound to be removed from active set. */
							 | 
						||
| 
								 | 
							
																	BooleanType updateCholesky	/**< Flag indicating if Cholesky decomposition shall be updated. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Solves the system Ra = b or R^Ta = b where R is an upper triangular matrix.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_DIV_BY_ZERO */
							 | 
						||
| 
								 | 
							
										returnValue backsolveR(	const real_t* const b,	/**< Right hand side vector. */
							 | 
						||
| 
								 | 
							
																BooleanType transposed,	/**< Indicates if the transposed system shall be solved. */
							 | 
						||
| 
								 | 
							
																real_t* const a 		/**< Output: Solution vector */
							 | 
						||
| 
								 | 
							
																);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Solves the system Ra = b or R^Ta = b where R is an upper triangular matrix. \n
							 | 
						||
| 
								 | 
							
										 *  Special variant for the case that this function is called from within "removeBound()".
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_DIV_BY_ZERO */
							 | 
						||
| 
								 | 
							
										returnValue backsolveR(	const real_t* const b,		/**< Right hand side vector. */
							 | 
						||
| 
								 | 
							
																BooleanType transposed,		/**< Indicates if the transposed system shall be solved. */
							 | 
						||
| 
								 | 
							
																BooleanType removingBound,	/**< Indicates if function is called from "removeBound()". */
							 | 
						||
| 
								 | 
							
																real_t* const a 			/**< Output: Solution vector */
							 | 
						||
| 
								 | 
							
																);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Determines step direction of the shift of the QP data.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										returnValue hotstart_determineDataShift(const int* const FX_idx, 	/**< Index array of fixed variables. */
							 | 
						||
| 
								 | 
							
																				const real_t* const g_new,	/**< New gradient vector. */
							 | 
						||
| 
								 | 
							
																				const real_t* const lb_new,	/**< New lower bounds. */
							 | 
						||
| 
								 | 
							
																				const real_t* const ub_new,	/**< New upper bounds. */
							 | 
						||
| 
								 | 
							
																				real_t* const delta_g,	 	/**< Output: Step direction of gradient vector. */
							 | 
						||
| 
								 | 
							
																				real_t* const delta_lb,	 	/**< Output: Step direction of lower bounds. */
							 | 
						||
| 
								 | 
							
																				real_t* const delta_ub,	 	/**< Output: Step direction of upper bounds. */
							 | 
						||
| 
								 | 
							
																				BooleanType& Delta_bB_isZero/**< Output: Indicates if active bounds are to be shifted. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Checks if lower/upper bounds remain consistent
							 | 
						||
| 
								 | 
							
										 *  (i.e. if lb <= ub) during the current step.
							 | 
						||
| 
								 | 
							
										 *	\return BT_TRUE iff bounds remain consistent
							 | 
						||
| 
								 | 
							
										 */
							 | 
						||
| 
								 | 
							
										BooleanType areBoundsConsistent(	const real_t* const delta_lb,		/**< Step direction of lower bounds. */
							 | 
						||
| 
								 | 
							
																			const real_t* const delta_ub		/**< Step direction of upper bounds. */
							 | 
						||
| 
								 | 
							
																			) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Setups internal QP data.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
													RET_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
										returnValue setupQPdata(	const real_t* const _H, 	/**< Hessian matrix. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _R, 	/**< Cholesky factorization of the Hessian matrix. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _g,		/**< Gradient vector. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _lb,	/**< Lower bounds (on variables). \n
							 | 
						||
| 
								 | 
							
																									 If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _ub		/**< Upper bounds (on variables). \n
							 | 
						||
| 
								 | 
							
																									 If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Sets Hessian matrix of the QP.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue setH(	const real_t* const H_new	/**< New Hessian matrix (with correct dimension!). */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Changes gradient vector of the QP.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue setG(	const real_t* const g_new	/**< New gradient vector (with correct dimension!). */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Changes lower bound vector of the QP.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue setLB(	const real_t* const lb_new	/**< New lower bound vector (with correct dimension!). */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Changes single entry of lower bound vector of the QP.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN  \n
							 | 
						||
| 
								 | 
							
													RET_INDEX_OUT_OF_BOUNDS */
							 | 
						||
| 
								 | 
							
										inline returnValue setLB(	int number,		/**< Number of entry to be changed. */
							 | 
						||
| 
								 | 
							
																	real_t value	/**< New value for entry of lower bound vector. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Changes upper bound vector of the QP.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline returnValue setUB(	const real_t* const ub_new	/**< New upper bound vector (with correct dimension!). */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Changes single entry of upper bound vector of the QP.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN  \n
							 | 
						||
| 
								 | 
							
													RET_INDEX_OUT_OF_BOUNDS */
							 | 
						||
| 
								 | 
							
										inline returnValue setUB(	int number,		/**< Number of entry to be changed. */
							 | 
						||
| 
								 | 
							
																	real_t value	/**< New value for entry of upper bound vector. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Computes parameters for the Givens matrix G for which [x,y]*G = [z,0]
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline void computeGivens(	real_t xold,	/**< Matrix entry to be normalised. */
							 | 
						||
| 
								 | 
							
																	real_t yold,	/**< Matrix entry to be annihilated. */
							 | 
						||
| 
								 | 
							
																	real_t& xnew,	/**< Output: Normalised matrix entry. */
							 | 
						||
| 
								 | 
							
																	real_t& ynew,	/**< Output: Annihilated matrix entry. */
							 | 
						||
| 
								 | 
							
																	real_t& c,		/**< Output: Cosine entry of Givens matrix. */
							 | 
						||
| 
								 | 
							
																	real_t& s 		/**< Output: Sine entry of Givens matrix. */
							 | 
						||
| 
								 | 
							
																	) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Applies Givens matrix determined by c and s (cf. computeGivens).
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										inline void applyGivens(	real_t c,		/**< Cosine entry of Givens matrix. */
							 | 
						||
| 
								 | 
							
																	real_t s,		/**< Sine entry of Givens matrix. */
							 | 
						||
| 
								 | 
							
																	real_t xold,	/**< Matrix entry to be transformed corresponding to
							 | 
						||
| 
								 | 
							
																					 *	 the normalised entry of the original matrix. */
							 | 
						||
| 
								 | 
							
																	real_t yold, 	/**< Matrix entry to be transformed corresponding to
							 | 
						||
| 
								 | 
							
																					 *	 the annihilated entry of the original matrix. */
							 | 
						||
| 
								 | 
							
																	real_t& xnew,	/**< Output: Transformed matrix entry corresponding to
							 | 
						||
| 
								 | 
							
																					 *	 the normalised entry of the original matrix. */
							 | 
						||
| 
								 | 
							
																	real_t& ynew	/**< Output: Transformed matrix entry corresponding to
							 | 
						||
| 
								 | 
							
																					 *	 the annihilated entry of the original matrix. */
							 | 
						||
| 
								 | 
							
																	) const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*
							 | 
						||
| 
								 | 
							
									 *	PRIVATE MEMBER FUNCTIONS
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									private:
							 | 
						||
| 
								 | 
							
										/** Determines step direction of the homotopy path.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
										 			RET_STEPDIRECTION_FAILED_CHOLESKY */
							 | 
						||
| 
								 | 
							
										returnValue hotstart_determineStepDirection(const int* const FR_idx, 		/**< Index array of free variables. */
							 | 
						||
| 
								 | 
							
																					const int* const FX_idx, 		/**< Index array of fixed variables. */
							 | 
						||
| 
								 | 
							
																					const real_t* const delta_g,	/**< Step direction of gradient vector. */
							 | 
						||
| 
								 | 
							
																					const real_t* const delta_lb,	/**< Step direction of lower bounds. */
							 | 
						||
| 
								 | 
							
																					const real_t* const delta_ub,	/**< Step direction of upper bounds. */
							 | 
						||
| 
								 | 
							
																					BooleanType Delta_bB_isZero,	/**< Indicates if active bounds are to be shifted. */
							 | 
						||
| 
								 | 
							
																					real_t* const delta_xFX, 		/**< Output: Primal homotopy step direction of fixed variables. */
							 | 
						||
| 
								 | 
							
																					real_t* const delta_xFR,	 	/**< Output: Primal homotopy step direction of free variables. */
							 | 
						||
| 
								 | 
							
																					real_t* const delta_yFX 		/**< Output: Dual homotopy step direction of fixed variables' multiplier. */
							 | 
						||
| 
								 | 
							
																					);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Determines the maximum possible step length along the homotopy path.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
										returnValue hotstart_determineStepLength(	const int* const FR_idx, 		/**< Index array of free variables. */
							 | 
						||
| 
								 | 
							
																					const int* const FX_idx, 		/**< Index array of fixed variables. */
							 | 
						||
| 
								 | 
							
																					const real_t* const delta_lb,	/**< Step direction of lower bounds. */
							 | 
						||
| 
								 | 
							
																					const real_t* const delta_ub,	/**< Step direction of upper bounds. */
							 | 
						||
| 
								 | 
							
																					const real_t* const delta_xFR,	/**< Primal homotopy step direction of free variables. */
							 | 
						||
| 
								 | 
							
																					const real_t* const delta_yFX,	/**< Dual homotopy step direction of fixed variables' multiplier. */
							 | 
						||
| 
								 | 
							
																					int& BC_idx, 					/**< Output: Index of blocking constraint. */
							 | 
						||
| 
								 | 
							
																					SubjectToStatus& BC_status		/**< Output: Status of blocking constraint. */
							 | 
						||
| 
								 | 
							
																					);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Performs a step along the homotopy path (and updates active set).
							 | 
						||
| 
								 | 
							
										 *	\return  SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
										 			 RET_OPTIMAL_SOLUTION_FOUND \n
							 | 
						||
| 
								 | 
							
										 			 RET_REMOVE_FROM_ACTIVESET_FAILED \n
							 | 
						||
| 
								 | 
							
													 RET_ADD_TO_ACTIVESET_FAILED \n
							 | 
						||
| 
								 | 
							
													 RET_QP_INFEASIBLE */
							 | 
						||
| 
								 | 
							
										returnValue hotstart_performStep(	const int* const FR_idx, 			/**< Index array of free variables. */
							 | 
						||
| 
								 | 
							
																			const int* const FX_idx, 			/**< Index array of fixed variables. */
							 | 
						||
| 
								 | 
							
																			const real_t* const delta_g,	 	/**< Step direction of gradient vector. */
							 | 
						||
| 
								 | 
							
																			const real_t* const delta_lb,	 	/**< Step direction of lower bounds. */
							 | 
						||
| 
								 | 
							
																			const real_t* const delta_ub,	 	/**< Step direction of upper bounds. */
							 | 
						||
| 
								 | 
							
																			const real_t* const delta_xFX, 		/**< Primal homotopy step direction of fixed variables. */
							 | 
						||
| 
								 | 
							
																			const real_t* const delta_xFR,	 	/**< Primal homotopy step direction of free variables. */
							 | 
						||
| 
								 | 
							
																			const real_t* const delta_yFX, 		/**< Dual homotopy step direction of fixed variables' multiplier. */
							 | 
						||
| 
								 | 
							
																			int BC_idx, 						/**< Index of blocking constraint. */
							 | 
						||
| 
								 | 
							
																			SubjectToStatus BC_status 			/**< Status of blocking constraint. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										#ifdef PC_DEBUG  /* Define print functions only for debugging! */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Prints concise information on the current iteration.
							 | 
						||
| 
								 | 
							
										 *	\return  SUCCESSFUL_RETURN \n */
							 | 
						||
| 
								 | 
							
										returnValue printIteration(	int iteration,				/**< Number of current iteration. */
							 | 
						||
| 
								 | 
							
																	int BC_idx, 				/**< Index of blocking bound. */
							 | 
						||
| 
								 | 
							
																	SubjectToStatus BC_status	/**< Status of blocking bound. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										#endif  /* PC_DEBUG */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/** Determines the maximum violation of the KKT optimality conditions
							 | 
						||
| 
								 | 
							
										 *  of the current iterate within the QProblemB object.
							 | 
						||
| 
								 | 
							
										 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
										 * 			RET_INACCURATE_SOLUTION \n
							 | 
						||
| 
								 | 
							
										 * 			RET_NO_SOLUTION */
							 | 
						||
| 
								 | 
							
										returnValue checkKKTconditions( );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/*
							 | 
						||
| 
								 | 
							
									 *	PROTECTED MEMBER VARIABLES
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									protected:
							 | 
						||
| 
								 | 
							
										real_t H[NVMAX*NVMAX];		/**< Hessian matrix. */
							 | 
						||
| 
								 | 
							
										BooleanType hasHessian;		/**< Flag indicating whether H contains Hessian or corresponding Cholesky factor R; \sa init. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										real_t g[NVMAX];			/**< Gradient. */
							 | 
						||
| 
								 | 
							
										real_t lb[NVMAX];			/**< Lower bound vector (on variables). */
							 | 
						||
| 
								 | 
							
										real_t ub[NVMAX];			/**< Upper bound vector (on variables). */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										Bounds bounds;				/**< Data structure for problem's bounds. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										real_t R[NVMAX*NVMAX];		/**< Cholesky decomposition of H (i.e. H = R^T*R). */
							 | 
						||
| 
								 | 
							
										BooleanType hasCholesky;	/**< Flag indicating whether Cholesky decomposition has already been setup. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										real_t x[NVMAX];			/**< Primal solution vector. */
							 | 
						||
| 
								 | 
							
										real_t y[NVMAX+NCMAX];		/**< Dual solution vector. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										real_t tau;					/**< Last homotopy step length. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										QProblemStatus status;		/**< Current status of the solution process. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										BooleanType infeasible;		/**< QP infeasible? */
							 | 
						||
| 
								 | 
							
										BooleanType unbounded;		/**< QP unbounded? */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										HessianType hessianType;	/**< Type of Hessian matrix. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										PrintLevel printlevel;		/**< Print level. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										int count;					/**< Counts the number of hotstart function calls (internal usage only!). */
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <QProblemB.ipp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif	/* QPOASES_QPROBLEMB_HPP */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	end of file
							 | 
						||
| 
								 | 
							
								 */
							 |