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.
		
		
		
		
		
			
		
			
				
					
					
						
							1641 lines
						
					
					
						
							64 KiB
						
					
					
				
			
		
		
	
	
							1641 lines
						
					
					
						
							64 KiB
						
					
					
				/*
 | 
						|
 *	This file is part of qpOASES.
 | 
						|
 *
 | 
						|
 *	qpOASES -- An Implementation of the Online Active Set Strategy.
 | 
						|
 *	Copyright (C) 2007-2015 by Hans Joachim Ferreau, Andreas Potschka,
 | 
						|
 *	Christian Kirches et al. All rights reserved.
 | 
						|
 *
 | 
						|
 *	qpOASES is free software; you can redistribute it and/or
 | 
						|
 *	modify it under the terms of the GNU Lesser General Public
 | 
						|
 *	License as published by the Free Software Foundation; either
 | 
						|
 *	version 2.1 of the License, or (at your option) any later version.
 | 
						|
 *
 | 
						|
 *	qpOASES is distributed in the hope that it will be useful,
 | 
						|
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
 *	See the GNU Lesser General Public License for more details.
 | 
						|
 *
 | 
						|
 *	You should have received a copy of the GNU Lesser General Public
 | 
						|
 *	License along with qpOASES; if not, write to the Free Software
 | 
						|
 *	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 *	\file include/qpOASES_e/QProblemB.h
 | 
						|
 *	\author Hans Joachim Ferreau, Andreas Potschka, Christian Kirches
 | 
						|
 *	\version 3.1embedded
 | 
						|
 *	\date 2007-2015
 | 
						|
 *
 | 
						|
 *	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_H
 | 
						|
#define QPOASES_QPROBLEMB_H
 | 
						|
 | 
						|
 | 
						|
#include <qpOASES_e/Bounds.h>
 | 
						|
#include <qpOASES_e/Options.h>
 | 
						|
#include <qpOASES_e/Matrices.h>
 | 
						|
#include <qpOASES_e/Flipper.h>
 | 
						|
 | 
						|
 | 
						|
BEGIN_NAMESPACE_QPOASES
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	Bounds *emptyBounds;
 | 
						|
	Bounds *auxiliaryBounds;
 | 
						|
 | 
						|
	real_t *ub_new_far;
 | 
						|
	real_t *lb_new_far;
 | 
						|
 | 
						|
	real_t *g_new;
 | 
						|
	real_t *lb_new;
 | 
						|
	real_t *ub_new;
 | 
						|
 | 
						|
	real_t *g_new2;
 | 
						|
	real_t *lb_new2;
 | 
						|
	real_t *ub_new2;
 | 
						|
 | 
						|
	real_t *Hx;
 | 
						|
 | 
						|
	real_t *_H;
 | 
						|
 | 
						|
	real_t *g_original;
 | 
						|
	real_t *lb_original;
 | 
						|
	real_t *ub_original;
 | 
						|
 | 
						|
	real_t *delta_xFR;
 | 
						|
	real_t *delta_xFX;
 | 
						|
	real_t *delta_yFX;
 | 
						|
	real_t *delta_g;
 | 
						|
	real_t *delta_lb;
 | 
						|
	real_t *delta_ub;
 | 
						|
 | 
						|
	real_t *gMod;
 | 
						|
 | 
						|
	real_t *num;
 | 
						|
	real_t *den;
 | 
						|
 | 
						|
	real_t *rhs;
 | 
						|
	real_t *r;
 | 
						|
} QProblemB_ws;
 | 
						|
 | 
						|
int QProblemB_ws_calculateMemorySize( unsigned int nV );
 | 
						|
 | 
						|
char *QProblemB_ws_assignMemory( unsigned int nV, QProblemB_ws **mem, void *raw_memory );
 | 
						|
 | 
						|
QProblemB_ws *QProblemB_ws_createMemory( unsigned int nV );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 *	\brief Implements the online active set strategy for box-constrained QPs.
 | 
						|
 *
 | 
						|
 *	Class for setting up and solving quadratic programs with bounds (= box constraints) only.
 | 
						|
 *	The main feature is the possibility to use the newly developed online active set strategy
 | 
						|
 *	for parametric quadratic programming.
 | 
						|
 *
 | 
						|
 *	\author Hans Joachim Ferreau, Andreas Potschka, Christian Kirches
 | 
						|
 *	\version 3.1embedded
 | 
						|
 *	\date 2007-2015
 | 
						|
 */
 | 
						|
typedef struct
 | 
						|
{
 | 
						|
	QProblemB_ws *ws;
 | 
						|
	Bounds *bounds;					/**< Data structure for problem's bounds. */
 | 
						|
	Flipper *flipper;				/**< Struct for making a temporary copy of the matrix factorisations. */
 | 
						|
 | 
						|
	DenseMatrix* H;					/**< Hessian matrix pointer. */
 | 
						|
 | 
						|
	Options options;				/**< Struct containing all user-defined options for solving QPs. */
 | 
						|
	TabularOutput tabularOutput;	/**< Struct storing information for tabular output (printLevel == PL_TABULAR). */
 | 
						|
 | 
						|
	real_t *g;						/**< Gradient. */
 | 
						|
	real_t *lb;						/**< Lower bound vector (on variables). */
 | 
						|
	real_t *ub;						/**< Upper bound vector (on variables). */
 | 
						|
 | 
						|
	real_t *R;						/**< Cholesky factor of H (i.e. H = R^T*R). */
 | 
						|
 | 
						|
	real_t *x;						/**< Primal solution vector. */
 | 
						|
	real_t *y;						/**< Dual solution vector. */
 | 
						|
 | 
						|
	real_t *delta_xFR_TMP;			/**< Temporary for determineStepDirection */
 | 
						|
 | 
						|
	real_t tau;						/**< Last homotopy step length. */
 | 
						|
	real_t regVal;					/**< Holds the offset used to regularise Hessian matrix (zero by default). */
 | 
						|
 | 
						|
	real_t ramp0;					/**< Start value for Ramping Strategy. */
 | 
						|
	real_t ramp1;					/**< Final value for Ramping Strategy. */
 | 
						|
 | 
						|
	QProblemStatus status;			/**< Current status of the solution process. */
 | 
						|
	HessianType hessianType;		/**< Type of Hessian matrix. */
 | 
						|
 | 
						|
	BooleanType haveCholesky;		/**< Flag indicating whether Cholesky decomposition has already been setup. */
 | 
						|
	BooleanType infeasible;			/**< QP infeasible? */
 | 
						|
	BooleanType unbounded;			/**< QP unbounded? */
 | 
						|
 | 
						|
	int rampOffset;					/**< Offset index for Ramping. */
 | 
						|
	unsigned int count;				/**< Counts the number of hotstart function calls (internal usage only!). */
 | 
						|
} QProblemB;
 | 
						|
 | 
						|
int QProblemB_calculateMemorySize( unsigned int nV );
 | 
						|
 | 
						|
char *QProblemB_assignMemory( unsigned int nV, QProblemB **mem, void *raw_memory );
 | 
						|
 | 
						|
QProblemB *QProblemB_createMemory( unsigned int nV );
 | 
						|
 | 
						|
 | 
						|
/** Constructor which takes the QP dimension and Hessian type
 | 
						|
 *  information. If the Hessian is the zero (i.e. HST_ZERO) or the
 | 
						|
 *  identity matrix (i.e. HST_IDENTITY), respectively, no memory
 | 
						|
 *  is allocated for it and a NULL pointer can be passed for it
 | 
						|
 *  to the init() functions. */
 | 
						|
void QProblemBCON(	QProblemB* _THIS,
 | 
						|
					int _nV,						/**< Number of variables. */
 | 
						|
					HessianType _hessianType		/**< Type of Hessian matrix. */
 | 
						|
					);
 | 
						|
 | 
						|
void QProblemBCPY(	QProblemB* FROM,
 | 
						|
					QProblemB* TO
 | 
						|
					);
 | 
						|
 | 
						|
 | 
						|
/** Clears all data structures of QProblemB except for QP data.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_RESET_FAILED */
 | 
						|
returnValue QProblemB_reset( QProblemB* _THIS );
 | 
						|
 | 
						|
 | 
						|
/** Initialises a simply bounded QP problem with given QP data and tries to solve it
 | 
						|
 *	using at most nWSR iterations.
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveInitialQP for initialisation!
 | 
						|
 *
 | 
						|
 *	\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 */
 | 
						|
returnValue QProblemB_initM(	QProblemB* _THIS,
 | 
						|
								DenseMatrix *_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. */
 | 
						|
		 						real_t* const cputime 		/**< Input: Maximum CPU time allowed for QP initialisation. \n
 | 
						|
																 Output: CPU time spent for QP initialisation (if pointer passed). */
 | 
						|
								);
 | 
						|
 | 
						|
/** Initialises a simply bounded QP problem with given QP data and tries to solve it
 | 
						|
 *	using at most nWSR iterations.
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveInitialQP for initialisation!
 | 
						|
 *
 | 
						|
 *	\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 */
 | 
						|
returnValue QProblemB_init(	QProblemB* _THIS,
 | 
						|
							real_t* const _H, 			/**< Hessian matrix. \n
 | 
						|
															 If Hessian matrix is trivial, a NULL pointer can be passed. */
 | 
						|
							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. */
 | 
						|
		 					real_t* const cputime 		/**< Input: Maximum CPU time allowed for QP initialisation. \n
 | 
						|
															 Output: CPU time spent for QP initialisation (if pointer passed). */
 | 
						|
							);
 | 
						|
 | 
						|
/** Initialises a simply bounded QP problem with given QP data to be read from files and solves it
 | 
						|
 *	using at most nWSR iterations.
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveInitialQP for initialisation!
 | 
						|
 *
 | 
						|
 *	\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_UNABLE_TO_READ_FILE */
 | 
						|
returnValue QProblemB_initF(	QProblemB* _THIS,
 | 
						|
								const char* const H_file, 	/**< Name of file where Hessian matrix is stored. \n
 | 
						|
																 If Hessian matrix is trivial, a NULL pointer can be passed. */
 | 
						|
								const char* const g_file,  	/**< Name of file where gradient vector is stored. */
 | 
						|
								const char* const lb_file, 	/**< Name of file where lower bound vector. \n
 | 
						|
																 If no lower bounds exist, a NULL pointer can be passed. */
 | 
						|
								const char* const ub_file, 	/**< Name of file where upper bound vector. \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. */
 | 
						|
		 						real_t* const cputime 		/**< Input: Maximum CPU time allowed for QP initialisation. \n
 | 
						|
																 Output: CPU time spent for QP initialisation (if pointer passed). */
 | 
						|
								);
 | 
						|
 | 
						|
/** Initialises a simply bounded QP problem with given QP data and tries to solve it
 | 
						|
 *	using at most nWSR iterations. Depending on the parameter constellation it: \n
 | 
						|
 *	1. 0,    0,    0 : starts with xOpt = 0, yOpt = 0 and gB empty (or all implicit equality bounds), \n
 | 
						|
 *	2. xOpt, 0,    0 : starts with xOpt, yOpt = 0 and obtain gB by "clipping", \n
 | 
						|
 *	3. 0,    yOpt, 0 : starts with xOpt = 0, yOpt and obtain gB from yOpt != 0, \n
 | 
						|
 *	4. 0,    0,    gB: starts with xOpt = 0, yOpt = 0 and gB, \n
 | 
						|
 *	5. xOpt, yOpt, 0 : starts with xOpt, yOpt and obtain gB from yOpt != 0, \n
 | 
						|
 *	6. xOpt, 0,    gB: starts with xOpt, yOpt = 0 and gB, \n
 | 
						|
 *	7. xOpt, yOpt, gB: starts with xOpt, yOpt and gB (assume them to be consistent!)
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveInitialQP for initialisation!
 | 
						|
 *
 | 
						|
 *	\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 */
 | 
						|
returnValue QProblemB_initMW(	QProblemB* _THIS,
 | 
						|
								DenseMatrix *_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. */
 | 
						|
		 						real_t* const cputime,			/**< Input: Maximum CPU time allowed for QP initialisation. \n
 | 
						|
													 				 Output: CPU time spent for QP initialisation. */
 | 
						|
								const real_t* const xOpt,		/**< Optimal primal solution vector. A NULL pointer can be passed. \n
 | 
						|
																	 (If a null pointer is passed, the old primal solution is kept!) */
 | 
						|
								const real_t* const yOpt,		/**< Optimal dual solution vector. A NULL pointer can be passed. \n
 | 
						|
																	 (If a null pointer is passed, the old dual solution is kept!) */
 | 
						|
								Bounds* const guessedBounds,	/**< Optimal working set of bounds for solution (xOpt,yOpt). \n
 | 
						|
																	 (If a null pointer is passed, all bounds are assumed inactive!) */
 | 
						|
								const real_t* const _R			/**< Pre-computed (upper triangular) Cholesky factor of Hessian matrix.
 | 
						|
																 	 The Cholesky factor must be stored in a real_t array of size nV*nV
 | 
						|
																	 in row-major format. Note: Only used if xOpt/yOpt and gB are NULL! \n
 | 
						|
																	 (If a null pointer is passed, Cholesky decomposition is computed internally!) */
 | 
						|
								);
 | 
						|
 | 
						|
/** Initialises a simply bounded QP problem with given QP data and tries to solve it
 | 
						|
 *	using at most nWSR iterations. Depending on the parameter constellation it: \n
 | 
						|
 *	1. 0,    0,    0 : starts with xOpt = 0, yOpt = 0 and gB empty (or all implicit equality bounds), \n
 | 
						|
 *	2. xOpt, 0,    0 : starts with xOpt, yOpt = 0 and obtain gB by "clipping", \n
 | 
						|
 *	3. 0,    yOpt, 0 : starts with xOpt = 0, yOpt and obtain gB from yOpt != 0, \n
 | 
						|
 *	4. 0,    0,    gB: starts with xOpt = 0, yOpt = 0 and gB, \n
 | 
						|
 *	5. xOpt, yOpt, 0 : starts with xOpt, yOpt and obtain gB from yOpt != 0, \n
 | 
						|
 *	6. xOpt, 0,    gB: starts with xOpt, yOpt = 0 and gB, \n
 | 
						|
 *	7. xOpt, yOpt, gB: starts with xOpt, yOpt and gB (assume them to be consistent!)
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveInitialQP for initialisation!
 | 
						|
 *
 | 
						|
 *	\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 */
 | 
						|
returnValue QProblemB_initW(	QProblemB* _THIS,
 | 
						|
								real_t* const _H, 				/**< Hessian matrix. \n
 | 
						|
																	 If Hessian matrix is trivial, a NULL pointer can be passed. */
 | 
						|
								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. */
 | 
						|
		 						real_t* const cputime,			/**< Input: Maximum CPU time allowed for QP initialisation. \n
 | 
						|
													 				 Output: CPU time spent for QP initialisation. */
 | 
						|
								const real_t* const xOpt,		/**< Optimal primal solution vector. A NULL pointer can be passed. \n
 | 
						|
																	 (If a null pointer is passed, the old primal solution is kept!) */
 | 
						|
								const real_t* const yOpt,		/**< Optimal dual solution vector. A NULL pointer can be passed. \n
 | 
						|
																	 (If a null pointer is passed, the old dual solution is kept!) */
 | 
						|
								Bounds* const guessedBounds,	/**< Optimal working set of bounds for solution (xOpt,yOpt). \n
 | 
						|
																	 (If a null pointer is passed, all bounds are assumed inactive!) */
 | 
						|
								const real_t* const _R			/**< Pre-computed (upper triangular) Cholesky factor of Hessian matrix.
 | 
						|
																 	 The Cholesky factor must be stored in a real_t array of size nV*nV
 | 
						|
																	 in row-major format. Note: Only used if xOpt/yOpt and gB are NULL! \n
 | 
						|
																	 (If a null pointer is passed, Cholesky decomposition is computed internally!) */
 | 
						|
								);
 | 
						|
 | 
						|
/** Initialises a simply bounded QP problem with given QP data to be read from files and solves it
 | 
						|
 *	using at most nWSR iterations. Depending on the parameter constellation it: \n
 | 
						|
 *	1. 0,    0,    0 : starts with xOpt = 0, yOpt = 0 and gB empty (or all implicit equality bounds), \n
 | 
						|
 *	2. xOpt, 0,    0 : starts with xOpt, yOpt = 0 and obtain gB by "clipping", \n
 | 
						|
 *	3. 0,    yOpt, 0 : starts with xOpt = 0, yOpt and obtain gB from yOpt != 0, \n
 | 
						|
 *	4. 0,    0,    gB: starts with xOpt = 0, yOpt = 0 and gB, \n
 | 
						|
 *	5. xOpt, yOpt, 0 : starts with xOpt, yOpt and obtain gB from yOpt != 0, \n
 | 
						|
 *	6. xOpt, 0,    gB: starts with xOpt, yOpt = 0 and gB, \n
 | 
						|
 *	7. xOpt, yOpt, gB: starts with xOpt, yOpt and gB (assume them to be consistent!)
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveInitialQP for initialisation!
 | 
						|
 *
 | 
						|
 *	\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_UNABLE_TO_READ_FILE */
 | 
						|
returnValue QProblemB_initFW(	QProblemB* _THIS,
 | 
						|
								const char* const H_file, 		/**< Name of file where Hessian matrix is stored. \n
 | 
						|
																	 If Hessian matrix is trivial, a NULL pointer can be passed. */
 | 
						|
								const char* const g_file,  		/**< Name of file where gradient vector is stored. */
 | 
						|
								const char* const lb_file, 		/**< Name of file where lower bound vector. \n
 | 
						|
																	 If no lower bounds exist, a NULL pointer can be passed. */
 | 
						|
								const char* const ub_file, 		/**< Name of file where upper bound vector. \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. */
 | 
						|
		 						real_t* const cputime,			/**< Input: Maximum CPU time allowed for QP initialisation. \n
 | 
						|
													 				 Output: CPU time spent for QP initialisation. */
 | 
						|
								const real_t* const xOpt,		/**< Optimal primal solution vector. A NULL pointer can be passed. \n
 | 
						|
																	 (If a null pointer is passed, the old primal solution is kept!) */
 | 
						|
								const real_t* const yOpt,		/**< Optimal dual solution vector. A NULL pointer can be passed. \n
 | 
						|
																	 (If a null pointer is passed, the old dual solution is kept!) */
 | 
						|
								Bounds* const guessedBounds,	/**< Optimal working set of bounds for solution (xOpt,yOpt). \n
 | 
						|
																	 (If a null pointer is passed, all bounds are assumed inactive!) */
 | 
						|
								const char* const R_file		/**< Name of the file where a pre-computed (upper triangular) Cholesky factor
 | 
						|
																	 of the Hessian matrix is stored. \n
 | 
						|
																	 (If a null pointer is passed, Cholesky decomposition is computed internally!) */
 | 
						|
								);
 | 
						|
 | 
						|
 | 
						|
/** Solves an initialised QP sequence using the online active set strategy.
 | 
						|
 *	By default, QP solution is started from previous solution.
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveQP/solveRegularisedQP
 | 
						|
 *        for solving an initialised QP!
 | 
						|
 *
 | 
						|
 *	\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 */
 | 
						|
returnValue QProblemB_hotstart(	QProblemB* _THIS,
 | 
						|
								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 		/**< Input: Maximum CPU time allowed for QP solution. \n
 | 
						|
																 Output: CPU time spent for QP solution (or to perform nWSR iterations). */
 | 
						|
								);
 | 
						|
 | 
						|
/** Solves an initialised QP sequence using the online active set strategy,
 | 
						|
 *  where QP data is read from files. QP solution is started from previous solution.
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveQP/solveRegularisedQP
 | 
						|
 *        for solving an initialised QP!
 | 
						|
 *
 | 
						|
 *	\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_UNABLE_TO_READ_FILE \n
 | 
						|
			RET_INVALID_ARGUMENTS */
 | 
						|
returnValue QProblemB_hotstartF(	QProblemB* _THIS,
 | 
						|
									const char* const g_file, 	/**< Name of file where gradient, of neighbouring QP to be solved, is stored. */
 | 
						|
									const char* const lb_file, 	/**< Name of file where lower bounds, of neighbouring QP to be solved, is stored. \n
 | 
						|
											 						 If no lower bounds exist, a NULL pointer can be passed. */
 | 
						|
									const char* const ub_file, 	/**< Name of file where upper bounds, of neighbouring QP to be solved, is stored. \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 	 	/**< Input: Maximum CPU time allowed for QP solution. \n
 | 
						|
																	 Output: CPU time spent for QP solution (or to perform nWSR iterations). */
 | 
						|
									);
 | 
						|
 | 
						|
/** Solves an initialised QP sequence using the online active set strategy.
 | 
						|
 *	By default, QP solution is started from previous solution. If a guess
 | 
						|
 *	for the working set is provided, an initialised homotopy is performed.
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveQP/solveRegularisedQP
 | 
						|
 *        for solving an initialised QP!
 | 
						|
 *
 | 
						|
 *	\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_SETUP_AUXILIARYQP_FAILED */
 | 
						|
returnValue QProblemB_hotstartW(	QProblemB* _THIS,
 | 
						|
									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,		/**< Input: Maximum CPU time allowed for QP solution. \n
 | 
						|
														 			 Output: CPU time spent for QP solution (or to perform nWSR iterations). */
 | 
						|
									Bounds* const guessedBounds	/**< Optimal working set of bounds for solution (xOpt,yOpt). \n
 | 
						|
																	 (If a null pointer is passed, the previous working set is kept!) */
 | 
						|
									);
 | 
						|
 | 
						|
/** Solves an initialised QP sequence using the online active set strategy,
 | 
						|
 *  where QP data is read from files.
 | 
						|
 *	By default, QP solution is started from previous solution. If a guess
 | 
						|
 *	for the working set is provided, an initialised homotopy is performed.
 | 
						|
 *
 | 
						|
 *  Note: This function internally calls solveQP/solveRegularisedQP
 | 
						|
 *        for solving an initialised QP!
 | 
						|
 *
 | 
						|
 *	\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_UNABLE_TO_READ_FILE \n
 | 
						|
			RET_INVALID_ARGUMENTS \n
 | 
						|
			RET_SETUP_AUXILIARYQP_FAILED */
 | 
						|
returnValue QProblemB_hotstartFW(	QProblemB* _THIS,
 | 
						|
									const char* const g_file,	/**< Name of file where gradient, of neighbouring QP to be solved, is stored. */
 | 
						|
									const char* const lb_file,	/**< Name of file where lower bounds, of neighbouring QP to be solved, is stored. \n
 | 
						|
											 						 If no lower bounds exist, a NULL pointer can be passed. */
 | 
						|
									const char* const ub_file, 	/**< Name of file where upper bounds, of neighbouring QP to be solved, is stored. \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,		/**< Input:  Maximum CPU time allowed for QP solution. \n
 | 
						|
														 			 Output: CPU time spent for QP solution (or to perform nWSR iterations). */
 | 
						|
									Bounds* const guessedBounds	/**< Optimal working set of bounds for solution (xOpt,yOpt). \n
 | 
						|
																	 (If a null pointer is passed, the previous working set is kept!) */
 | 
						|
									);
 | 
						|
 | 
						|
 | 
						|
/** Writes a vector with the state of the working set
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 *	        RET_INVALID_ARGUMENTS */
 | 
						|
returnValue QProblemB_getWorkingSet(	QProblemB* _THIS,
 | 
						|
										real_t* workingSet		/** Output: array containing state of the working set. */
 | 
						|
										);
 | 
						|
 | 
						|
/** Writes a vector with the state of the working set of bounds
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 *	        RET_INVALID_ARGUMENTS */
 | 
						|
returnValue QProblemB_getWorkingSetBounds(	QProblemB* _THIS,
 | 
						|
											real_t* workingSetB	/** Output: array containing state of the working set of bounds. */
 | 
						|
											);
 | 
						|
 | 
						|
/** Writes a vector with the state of the working set of constraints
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 *	        RET_INVALID_ARGUMENTS */
 | 
						|
returnValue QProblemB_getWorkingSetConstraints(	QProblemB* _THIS,
 | 
						|
												real_t* workingSetC	/** Output: array containing state of the working set of constraints. */
 | 
						|
												);
 | 
						|
 | 
						|
 | 
						|
/** Returns current bounds object of the QP (deep copy).
 | 
						|
  *	\return SUCCESSFUL_RETURN \n
 | 
						|
  			RET_QPOBJECT_NOT_SETUP */
 | 
						|
static inline returnValue QProblemB_getBounds(	QProblemB* _THIS,
 | 
						|
												Bounds* _bounds	/** Output: Bounds object. */
 | 
						|
												);
 | 
						|
 | 
						|
 | 
						|
/** Returns the number of variables.
 | 
						|
 *	\return Number of variables. */
 | 
						|
static inline int QProblemB_getNV( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Returns the number of free variables.
 | 
						|
 *	\return Number of free variables. */
 | 
						|
static inline int QProblemB_getNFR( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Returns the number of fixed variables.
 | 
						|
 *	\return Number of fixed variables. */
 | 
						|
static inline int QProblemB_getNFX( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Returns the number of implicitly fixed variables.
 | 
						|
 *	\return Number of implicitly fixed variables. */
 | 
						|
static inline int QProblemB_getNFV( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Returns the dimension of null space.
 | 
						|
 *	\return Dimension of null space. */
 | 
						|
int QProblemB_getNZ( QProblemB* _THIS );
 | 
						|
 | 
						|
 | 
						|
/** 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 QProblemB_getObjVal( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Returns the objective function value at an arbitrary point x.
 | 
						|
 *	\return Objective function value at point x */
 | 
						|
real_t QProblemB_getObjValX(	QProblemB* _THIS,
 | 
						|
								const real_t* const _x	/**< Point at which the objective function shall be evaluated. */
 | 
						|
								);
 | 
						|
 | 
						|
/** Returns the primal solution vector.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_QP_NOT_SOLVED */
 | 
						|
returnValue QProblemB_getPrimalSolution(	QProblemB* _THIS,
 | 
						|
											real_t* const xOpt			/**< Output: Primal solution vector (if QP has been solved). */
 | 
						|
											);
 | 
						|
 | 
						|
/** Returns the dual solution vector.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_QP_NOT_SOLVED */
 | 
						|
returnValue QProblemB_getDualSolution(	QProblemB* _THIS,
 | 
						|
										real_t* const yOpt	/**< Output: Dual solution vector (if QP has been solved). */
 | 
						|
										);
 | 
						|
 | 
						|
 | 
						|
/** Returns status of the solution process.
 | 
						|
 *	\return Status of solution process. */
 | 
						|
static inline QProblemStatus QProblemB_getStatus( QProblemB* _THIS );
 | 
						|
 | 
						|
 | 
						|
/** Returns if the QProblem object is initialised.
 | 
						|
 *	\return BT_TRUE:  QProblemB initialised \n
 | 
						|
 			BT_FALSE: QProblemB not initialised */
 | 
						|
static inline BooleanType QProblemB_isInitialised( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Returns if the QP has been solved.
 | 
						|
 *	\return BT_TRUE:  QProblemB solved \n
 | 
						|
 			BT_FALSE: QProblemB not solved */
 | 
						|
static inline BooleanType QProblemB_isSolved( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Returns if the QP is infeasible.
 | 
						|
 *	\return BT_TRUE:  QP infeasible \n
 | 
						|
 			BT_FALSE: QP feasible (or not known to be infeasible!) */
 | 
						|
static inline BooleanType QProblemB_isInfeasible( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Returns if the QP is unbounded.
 | 
						|
 *	\return BT_TRUE:  QP unbounded \n
 | 
						|
 			BT_FALSE: QP unbounded (or not known to be unbounded!) */
 | 
						|
static inline BooleanType QProblemB_isUnbounded( QProblemB* _THIS );
 | 
						|
 | 
						|
 | 
						|
/** Returns Hessian type flag (type is not determined due to _THIS call!).
 | 
						|
 *	\return Hessian type. */
 | 
						|
static inline HessianType QProblemB_getHessianType( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Changes the print level.
 | 
						|
 *	\return SUCCESSFUL_RETURN */
 | 
						|
static inline returnValue QProblemB_setHessianType(	QProblemB* _THIS,
 | 
						|
													HessianType _hessianType /**< New Hessian type. */
 | 
						|
													);
 | 
						|
 | 
						|
/** Returns if the QP has been internally regularised.
 | 
						|
 *	\return BT_TRUE:  Hessian is internally regularised for QP solution \n
 | 
						|
 			BT_FALSE: No internal Hessian regularisation is used for QP solution */
 | 
						|
static inline BooleanType QProblemB_usingRegularisation( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Returns current options struct.
 | 
						|
 *	\return Current options struct. */
 | 
						|
static inline Options QProblemB_getOptions( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Overrides current options with given ones.
 | 
						|
 *	\return SUCCESSFUL_RETURN */
 | 
						|
static inline returnValue QProblemB_setOptions(	QProblemB* _THIS,
 | 
						|
												Options _options	/**< New options. */
 | 
						|
												);
 | 
						|
 | 
						|
/** Returns the print level.
 | 
						|
 *	\return Print level. */
 | 
						|
static inline PrintLevel QProblemB_getPrintLevel( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Changes the print level.
 | 
						|
 *	\return SUCCESSFUL_RETURN */
 | 
						|
returnValue QProblemB_setPrintLevel(	QProblemB* _THIS,
 | 
						|
										PrintLevel _printlevel	/**< New print level. */
 | 
						|
										);
 | 
						|
 | 
						|
/** Returns the current number of QP problems solved.
 | 
						|
 *	\return Number of QP problems solved. */
 | 
						|
static inline unsigned int QProblemB_getCount( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Resets QP problem counter (to zero).
 | 
						|
 *	\return SUCCESSFUL_RETURN. */
 | 
						|
static inline returnValue QProblemB_resetCounter( QProblemB* _THIS );
 | 
						|
 | 
						|
 | 
						|
/** Prints concise list of properties of the current QP.
 | 
						|
 *	\return  SUCCESSFUL_RETURN \n */
 | 
						|
returnValue QProblemB_printProperties( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Prints a list of all options and their current values.
 | 
						|
 *	\return  SUCCESSFUL_RETURN \n */
 | 
						|
returnValue QProblemB_printOptions( QProblemB* _THIS );
 | 
						|
 | 
						|
 | 
						|
/** If Hessian type has been set by the user, nothing is done.
 | 
						|
 *  Otherwise the Hessian type is set to HST_IDENTITY, HST_ZERO, or
 | 
						|
 *  HST_POSDEF (default), respectively.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_HESSIAN_INDEFINITE */
 | 
						|
returnValue QProblemB_determineHessianType( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Determines type of existing constraints and bounds (i.e. implicitly fixed, unbounded etc.).
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_SETUPSUBJECTTOTYPE_FAILED */
 | 
						|
returnValue QProblemB_setupSubjectToType( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Determines type of new constraints and bounds (i.e. implicitly fixed, unbounded etc.).
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_SETUPSUBJECTTOTYPE_FAILED */
 | 
						|
returnValue QProblemB_setupSubjectToTypeNew(	QProblemB* _THIS,
 | 
						|
												const real_t* const lb_new,	/**< New lower bounds. */
 | 
						|
												const real_t* const ub_new	/**< New upper bounds. */
 | 
						|
												);
 | 
						|
 | 
						|
/** Computes the Cholesky decomposition 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!
 | 
						|
 *  Note: If Hessian turns out not to be positive definite, the Hessian type
 | 
						|
 *		  is set to HST_SEMIDEF accordingly.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 *			RET_HESSIAN_NOT_SPD \n
 | 
						|
 *			RET_INDEXLIST_CORRUPTED */
 | 
						|
returnValue QProblemB_computeCholesky( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Computes initial Cholesky decomposition of the projected Hessian making
 | 
						|
 *  use of the function setupCholeskyDecomposition() or setupCholeskyDecompositionProjected().
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 *			RET_HESSIAN_NOT_SPD \n
 | 
						|
 *			RET_INDEXLIST_CORRUPTED */
 | 
						|
returnValue QProblemB_setupInitialCholesky( QProblemB* _THIS );
 | 
						|
 | 
						|
 | 
						|
/** 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 QProblemB_obtainAuxiliaryWorkingSet(	QProblemB* _THIS,
 | 
						|
													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. */
 | 
						|
													Bounds* const guessedBounds,	/**< Guessed working set for solution (xOpt,yOpt). */
 | 
						|
													Bounds* auxiliaryBounds			/**< Input: Allocated bound object. \n
 | 
						|
																					 *	 Ouput: Working set for auxiliary QP. */
 | 
						|
													);
 | 
						|
 | 
						|
/** Decides if lower bounds are smaller than upper bounds
 | 
						|
 *
 | 
						|
 * \return SUCCESSFUL_RETURN \n
 | 
						|
 * 		   RET_QP_INFEASIBLE */
 | 
						|
returnValue QProblemB_areBoundsConsistent(	QProblemB* _THIS,
 | 
						|
											const real_t* const lb, /**< Vector of lower bounds*/
 | 
						|
											const real_t* const ub  /**< Vector of upper bounds*/
 | 
						|
											);
 | 
						|
 | 
						|
/** 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 QProblemB_backsolveR(	QProblemB* _THIS,
 | 
						|
									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 QProblemB_backsolveRrem(	QProblemB* _THIS,
 | 
						|
										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 QProblemB_determineDataShift(	QProblemB* _THIS,
 | 
						|
											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. */
 | 
						|
											);
 | 
						|
 | 
						|
 | 
						|
/** Sets up internal QP data.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_INVALID_ARGUMENTS */
 | 
						|
returnValue QProblemB_setupQPdataM(	QProblemB* _THIS,
 | 
						|
									DenseMatrix *_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. */
 | 
						|
									);
 | 
						|
 | 
						|
/** Sets up internal QP data. If the current Hessian is trivial
 | 
						|
 *  (i.e. HST_ZERO or HST_IDENTITY) but a non-trivial one is given,
 | 
						|
 *  memory for Hessian is allocated and it is set to the given one.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_INVALID_ARGUMENTS \n
 | 
						|
			RET_NO_HESSIAN_SPECIFIED */
 | 
						|
returnValue QProblemB_setupQPdata(	QProblemB* _THIS,
 | 
						|
									real_t* const _H, 			/**< Hessian matrix. \n
 | 
						|
																	 If Hessian matrix is trivial,a NULL pointer can be passed. */
 | 
						|
									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 up internal QP data by loading it from files. If the current Hessian
 | 
						|
 *  is trivial (i.e. HST_ZERO or HST_IDENTITY) but a non-trivial one is given,
 | 
						|
 *  memory for Hessian is allocated and it is set to the given one.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_UNABLE_TO_OPEN_FILE \n
 | 
						|
			RET_UNABLE_TO_READ_FILE \n
 | 
						|
			RET_INVALID_ARGUMENTS \n
 | 
						|
			RET_NO_HESSIAN_SPECIFIED */
 | 
						|
returnValue QProblemB_setupQPdataFromFile(	QProblemB* _THIS,
 | 
						|
											const char* const H_file, 	/**< Name of file where Hessian matrix, of neighbouring QP to be solved, is stored. \n
 | 
						|
														     				 If Hessian matrix is trivial,a NULL pointer can be passed. */
 | 
						|
											const char* const g_file, 	/**< Name of file where gradient, of neighbouring QP to be solved, is stored. */
 | 
						|
											const char* const lb_file, 	/**< Name of file where lower bounds, of neighbouring QP to be solved, is stored. \n
 | 
						|
										 			 						 If no lower bounds exist, a NULL pointer can be passed. */
 | 
						|
											const char* const ub_file 	/**< Name of file where upper bounds, of neighbouring QP to be solved, is stored. \n
 | 
						|
										 			 						 If no upper bounds exist, a NULL pointer can be passed. */
 | 
						|
											);
 | 
						|
 | 
						|
/** Loads new QP vectors from files (internal members are not affected!).
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_UNABLE_TO_OPEN_FILE \n
 | 
						|
			RET_UNABLE_TO_READ_FILE \n
 | 
						|
			RET_INVALID_ARGUMENTS */
 | 
						|
returnValue QProblemB_loadQPvectorsFromFile(	QProblemB* _THIS,
 | 
						|
												const char* const g_file, 	/**< Name of file where gradient, of neighbouring QP to be solved, is stored. */
 | 
						|
												const char* const lb_file, 	/**< Name of file where lower bounds, of neighbouring QP to be solved, is stored. \n
 | 
						|
										 			 							 If no lower bounds exist, a NULL pointer can be passed. */
 | 
						|
												const char* const ub_file, 	/**< Name of file where upper bounds, of neighbouring QP to be solved, is stored. \n
 | 
						|
										 			 							 If no upper bounds exist, a NULL pointer can be passed. */
 | 
						|
												real_t* const g_new,		/**< Output: Gradient of neighbouring QP to be solved. */
 | 
						|
												real_t* const lb_new,		/**< Output: Lower bounds of neighbouring QP to be solved */
 | 
						|
												real_t* const ub_new		/**< Output: Upper bounds of neighbouring QP to be solved */
 | 
						|
												);
 | 
						|
 | 
						|
 | 
						|
/** Sets internal infeasibility flag and throws given error in case the far bound
 | 
						|
 *	strategy is not enabled (as QP might actually not be infeasible in _THIS case).
 | 
						|
 *	\return RET_HOTSTART_STOPPED_INFEASIBILITY \n
 | 
						|
			RET_ENSURELI_FAILED_CYCLING \n
 | 
						|
			RET_ENSURELI_FAILED_NOINDEX */
 | 
						|
returnValue QProblemB_setInfeasibilityFlag(	QProblemB* _THIS,
 | 
						|
											returnValue returnvalue,	/**< Returnvalue to be tunneled. */
 | 
						|
											BooleanType doThrowError	/**< Flag forcing to throw an error. */
 | 
						|
											);
 | 
						|
 | 
						|
 | 
						|
/** Determines if next QP iteration can be performed within given CPU time limit.
 | 
						|
 *	\return BT_TRUE: CPU time limit is exceeded, stop QP solution. \n
 | 
						|
			BT_FALSE: Sufficient CPU time for next QP iteration. */
 | 
						|
BooleanType QProblemB_isCPUtimeLimitExceeded(	QProblemB* _THIS,
 | 
						|
												const real_t* const cputime,	/**< Maximum CPU time allowed for QP solution. */
 | 
						|
												real_t starttime,				/**< Start time of current QP solution. */
 | 
						|
												int nWSR						/**< Number of working set recalculations performed so far. */
 | 
						|
												);
 | 
						|
 | 
						|
 | 
						|
/** Regularise Hessian matrix by adding a scaled identity matrix to it.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
			RET_HESSIAN_ALREADY_REGULARISED */
 | 
						|
returnValue QProblemB_regulariseHessian( QProblemB* _THIS );
 | 
						|
 | 
						|
 | 
						|
/** Sets Hessian matrix of the QP.
 | 
						|
 *	\return SUCCESSFUL_RETURN */
 | 
						|
static inline returnValue QProblemB_setHM(	QProblemB* _THIS,
 | 
						|
											DenseMatrix* H_new	/**< New Hessian matrix. */
 | 
						|
											);
 | 
						|
 | 
						|
/** Sets dense Hessian matrix of the QP.
 | 
						|
 *  If a null pointer is passed and
 | 
						|
 *  a) hessianType is HST_IDENTITY, nothing is done,
 | 
						|
 *  b) hessianType is not HST_IDENTITY, Hessian matrix is set to zero.
 | 
						|
 *	\return SUCCESSFUL_RETURN */
 | 
						|
static inline returnValue QProblemB_setH(	QProblemB* _THIS,
 | 
						|
											real_t* const H_new	/**< New dense Hessian matrix (with correct dimension!). */
 | 
						|
											);
 | 
						|
 | 
						|
/** Changes gradient vector of the QP.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 *			RET_INVALID_ARGUMENTS */
 | 
						|
static inline returnValue QProblemB_setG(	QProblemB* _THIS,
 | 
						|
											const real_t* const g_new	/**< New gradient vector (with correct dimension!). */
 | 
						|
											);
 | 
						|
 | 
						|
/** Changes lower bound vector of the QP.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 *			RET_QPOBJECT_NOT_SETUP */
 | 
						|
static inline returnValue QProblemB_setLB(	QProblemB* _THIS,
 | 
						|
											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_QPOBJECT_NOT_SETUP \n
 | 
						|
 *			RET_INDEX_OUT_OF_BOUNDS */
 | 
						|
static inline returnValue QProblemB_setLBn(	QProblemB* _THIS,
 | 
						|
											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 \n
 | 
						|
 *			RET_QPOBJECT_NOT_SETUP */
 | 
						|
static inline returnValue QProblemB_setUB(	QProblemB* _THIS,
 | 
						|
											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_QPOBJECT_NOT_SETUP \n
 | 
						|
 *			RET_INDEX_OUT_OF_BOUNDS */
 | 
						|
static inline returnValue QProblemB_setUBn(	QProblemB* _THIS,
 | 
						|
											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 */
 | 
						|
static inline void QProblemB_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. */
 | 
						|
											);
 | 
						|
 | 
						|
/** Applies Givens matrix determined by c and s (cf. computeGivens).
 | 
						|
 *	\return SUCCESSFUL_RETURN */
 | 
						|
static inline void QProblemB_applyGivens(	real_t c,		/**< Cosine entry of Givens matrix. */
 | 
						|
											real_t s,		/**< Sine entry of Givens matrix. */
 | 
						|
											real_t nu, 		/**< Further factor: s/(1+c). */
 | 
						|
											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. */
 | 
						|
											);
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/** Compute relative length of homotopy in data space for termination
 | 
						|
 *  criterion.
 | 
						|
 *  \return Relative length in data space. */
 | 
						|
real_t QProblemB_getRelativeHomotopyLength(	QProblemB* _THIS,
 | 
						|
											const real_t* const g_new,	/**< Final gradient. */
 | 
						|
											const real_t* const lb_new,	/**< Final lower variable bounds. */
 | 
						|
											const real_t* const ub_new	/**< Final upper variable bounds. */
 | 
						|
											);
 | 
						|
 | 
						|
/** Ramping Strategy to avoid ties. Modifies homotopy start without
 | 
						|
 *  changing current active set.
 | 
						|
 *  \return SUCCESSFUL_RETURN */
 | 
						|
returnValue QProblemB_performRamping( QProblemB* _THIS );
 | 
						|
 | 
						|
 | 
						|
/** ... */
 | 
						|
returnValue QProblemB_updateFarBounds(	QProblemB* _THIS,
 | 
						|
										real_t curFarBound,				/**< ... */
 | 
						|
										int nRamp,						/**< ... */
 | 
						|
										const real_t* const lb_new,		/**< ... */
 | 
						|
										real_t* const lb_new_far,		/**< ... */
 | 
						|
										const real_t* const ub_new,		/**< ... */
 | 
						|
										real_t* const ub_new_far		/**< ... */
 | 
						|
										);
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/** Performs robustified ratio test yield the maximum possible step length
 | 
						|
 *  along the homotopy path.
 | 
						|
 *	\return  SUCCESSFUL_RETURN */
 | 
						|
returnValue QProblemB_performRatioTestB(	QProblemB* _THIS,
 | 
						|
											int nIdx, 					/**< Number of ratios to be checked. */
 | 
						|
											const int* const idxList, 	/**< Array containing the indices of all ratios to be checked. */
 | 
						|
											Bounds* const subjectTo,	/**< Bound object corresponding to ratios to be checked. */
 | 
						|
											const real_t* const num,	/**< Array containing all numerators for performing the ratio test. */
 | 
						|
											const real_t* const den,	/**< Array containing all denominators for performing the ratio test. */
 | 
						|
											real_t epsNum,				/**< Numerator tolerance. */
 | 
						|
											real_t epsDen,				/**< Denominator tolerance. */
 | 
						|
											real_t* t,					/**< Output: Maximum possible step length along the homotopy path. */
 | 
						|
											int* BC_idx 				/**< Output: Index of blocking constraint. */
 | 
						|
											);
 | 
						|
 | 
						|
/** Checks whether given ratio is blocking, i.e. limits the maximum step length
 | 
						|
 *  along the homotopy path to a value lower than given one.
 | 
						|
 *	\return  SUCCESSFUL_RETURN */
 | 
						|
static inline BooleanType QProblemB_isBlocking(	QProblemB* _THIS,
 | 
						|
												real_t num,		/**< Numerator for performing the ratio test. */
 | 
						|
												real_t den,		/**< Denominator for performing the ratio test. */
 | 
						|
												real_t epsNum,	/**< Numerator tolerance. */
 | 
						|
												real_t epsDen,	/**< Denominator tolerance. */
 | 
						|
												real_t* t		/**< Input:  Current maximum step length along the homotopy path,
 | 
						|
																 *   Output: Updated maximum possible step length along the homotopy path. */
 | 
						|
												);
 | 
						|
 | 
						|
 | 
						|
/** 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.
 | 
						|
 *  Note: This function is internally called by all init functions!
 | 
						|
 *	\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 QProblemB_solveInitialQP(	QProblemB* _THIS,
 | 
						|
										const real_t* const xOpt,		/**< Optimal primal solution vector.*/
 | 
						|
										const real_t* const yOpt,		/**< Optimal dual solution vector. */
 | 
						|
										Bounds* const guessedBounds,	/**< Optimal working set of bounds for solution (xOpt,yOpt). */
 | 
						|
										const real_t* const _R,			/**< Pre-computed (upper triangular) Cholesky factor of Hessian matrix. */
 | 
						|
										int* nWSR, 						/**< Input:  Maximum number of working set recalculations; \n
 | 
						|
														 				 *	 Output: Number of performed working set recalculations. */
 | 
						|
										real_t* const cputime			/**< Input:  Maximum CPU time allowed for QP solution. \n
 | 
						|
														 				 *	 Output: CPU time spent for QP solution (or to perform nWSR iterations). */
 | 
						|
										);
 | 
						|
 | 
						|
/** Solves an initialised QProblemB using online active set strategy.
 | 
						|
 *  Note: This function is internally called by all hotstart functions!
 | 
						|
 *	\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 */
 | 
						|
returnValue QProblemB_solveQP(	QProblemB* _THIS,
 | 
						|
								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,		/**< Input: Maximum CPU time allowed for QP solution. \n
 | 
						|
																 Output: CPU time spent for QP solution (or to perform nWSR iterations). */
 | 
						|
								int  nWSRperformed,			/**< Number of working set recalculations already performed to solve
 | 
						|
																 this QP within previous solveQP() calls. This number is
 | 
						|
																 always zero, except for successive calls from solveRegularisedQP()
 | 
						|
																 or when using the far bound strategy. */
 | 
						|
								BooleanType isFirstCall		/**< Indicating whether this is the first call for current QP. */
 | 
						|
								);
 | 
						|
 | 
						|
 | 
						|
/** Solves an initialised QProblemB using online active set strategy.
 | 
						|
 *  Note: This function is internally called by all hotstart functions!
 | 
						|
 *	\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 */
 | 
						|
returnValue QProblemB_solveRegularisedQP(	QProblemB* _THIS,
 | 
						|
											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,		/**< Input: Maximum CPU time allowed for QP solution. \n
 | 
						|
																			 Output: CPU time spent for QP solution (or to perform nWSR iterations). */
 | 
						|
											int  nWSRperformed,			/**< Number of working set recalculations already performed to solve
 | 
						|
																			 this QP within previous solveRegularisedQP() calls. This number is
 | 
						|
																			 always zero, except for successive calls when using the far bound strategy. */
 | 
						|
											BooleanType isFirstCall		/**< Indicating whether this is the first call for current QP. */
 | 
						|
											);
 | 
						|
 | 
						|
 | 
						|
/** Sets up 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 QProblemB_setupAuxiliaryWorkingSet(	QProblemB* _THIS,
 | 
						|
												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. */
 | 
						|
												);
 | 
						|
 | 
						|
/** Sets up the optimal primal/dual solution of the auxiliary initial QP.
 | 
						|
 *	\return SUCCESSFUL_RETURN */
 | 
						|
returnValue QProblemB_setupAuxiliaryQPsolution(	QProblemB* _THIS,
 | 
						|
												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. */
 | 
						|
												);
 | 
						|
 | 
						|
/** Sets up 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 (ialised!).
 | 
						|
 *	\return SUCCESSFUL_RETURN */
 | 
						|
returnValue QProblemB_setupAuxiliaryQPgradient( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Sets up 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 QProblemB_setupAuxiliaryQPbounds(	QProblemB* _THIS,
 | 
						|
												BooleanType useRelaxation	/**< Flag indicating if inactive bounds shall be relaxed. */
 | 
						|
												);
 | 
						|
 | 
						|
 | 
						|
/** Updates QP vectors, working sets and internal data structures in order to
 | 
						|
	start from an optimal solution corresponding to initial guesses of the working
 | 
						|
	set for bounds
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 *			RET_SETUP_AUXILIARYQP_FAILED */
 | 
						|
returnValue QProblemB_setupAuxiliaryQP(	QProblemB* _THIS,
 | 
						|
										Bounds* const guessedBounds	/**< Initial guess for working set of bounds. */
 | 
						|
										);
 | 
						|
 | 
						|
/** Determines step direction of the homotopy path.
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 			RET_STEPDIRECTION_FAILED_CHOLESKY */
 | 
						|
returnValue QProblemB_determineStepDirection(	QProblemB* _THIS,
 | 
						|
												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
 | 
						|
 *  and performs _THIS step (without changing working set).
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 *			RET_QP_INFEASIBLE \n
 | 
						|
 */
 | 
						|
returnValue QProblemB_performStep(	QProblemB* _THIS,
 | 
						|
									const real_t* const delta_g,	/**< Step direction of gradient. */
 | 
						|
									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, 					/**< Output: Index of blocking constraint. */
 | 
						|
									SubjectToStatus* BC_status		/**< Output: Status of blocking constraint. */
 | 
						|
									);
 | 
						|
 | 
						|
/** Updates active set.
 | 
						|
 *	\return  SUCCESSFUL_RETURN \n
 | 
						|
 			 RET_REMOVE_FROM_ACTIVESET_FAILED \n
 | 
						|
			 RET_ADD_TO_ACTIVESET_FAILED */
 | 
						|
returnValue QProblemB_changeActiveSet(	QProblemB* _THIS,
 | 
						|
										int BC_idx, 				/**< Index of blocking constraint. */
 | 
						|
										SubjectToStatus BC_status 	/**< Status of blocking constraint. */
 | 
						|
										);
 | 
						|
 | 
						|
/** Drift correction at end of each active set iteration
 | 
						|
 *  \return SUCCESSFUL_RETURN */
 | 
						|
returnValue QProblemB_performDriftCorrection( QProblemB* _THIS );
 | 
						|
 | 
						|
/** Determines if it is more efficient to refactorise the matrices when
 | 
						|
 *  hotstarting or not (i.e. better to update the existing factorisations).
 | 
						|
 *	\return BT_TRUE iff matrices shall be refactorised afresh
 | 
						|
 */
 | 
						|
BooleanType QProblemB_shallRefactorise(	QProblemB* _THIS,
 | 
						|
										Bounds* const guessedBounds	/**< Guessed new working set. */
 | 
						|
										);
 | 
						|
 | 
						|
 | 
						|
/** Adds a bound to active set (specialised version for the case where no constraints exist).
 | 
						|
 *	\return SUCCESSFUL_RETURN \n
 | 
						|
 			RET_ADDBOUND_FAILED */
 | 
						|
returnValue QProblemB_addBound(	QProblemB* _THIS,
 | 
						|
								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 QProblemB_removeBound(	QProblemB* _THIS,
 | 
						|
									int number,					/**< Number of bound to be removed from active set. */
 | 
						|
									BooleanType updateCholesky	/**< Flag indicating if Cholesky decomposition shall be updated. */
 | 
						|
									);
 | 
						|
 | 
						|
 | 
						|
/** Prints concise information on the current iteration.
 | 
						|
 *	\return  SUCCESSFUL_RETURN \n */
 | 
						|
returnValue QProblemB_printIteration(	QProblemB* _THIS,
 | 
						|
										int iter,					/**< Number of current iteration. */
 | 
						|
										int BC_idx, 				/**< Index of blocking bound. */
 | 
						|
										SubjectToStatus BC_status,	/**< Status of blocking bound. */
 | 
						|
										real_t homotopyLength,		/**< Current homotopy distance. */
 | 
						|
										BooleanType isFirstCall		/**< Indicating whether this is the first call for current QP. */
 | 
						|
										);
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t B o u n d s
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_getBounds( QProblemB* _THIS, Bounds* _bounds )
 | 
						|
{
 | 
						|
	int nV = QProblemB_getNV( _THIS );
 | 
						|
 | 
						|
	if ( nV == 0 )
 | 
						|
		return THROWERROR( RET_QPOBJECT_NOT_SETUP );
 | 
						|
 | 
						|
	_bounds = _THIS->bounds;
 | 
						|
 | 
						|
	return SUCCESSFUL_RETURN;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t N V
 | 
						|
 */
 | 
						|
static inline int QProblemB_getNV( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return Bounds_getNV( _THIS->bounds );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t N F R
 | 
						|
 */
 | 
						|
static inline int QProblemB_getNFR( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return Bounds_getNFR( _THIS->bounds );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t N F X
 | 
						|
 */
 | 
						|
static inline int QProblemB_getNFX( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return Bounds_getNFX( _THIS->bounds );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t N F V
 | 
						|
 */
 | 
						|
static inline int QProblemB_getNFV( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return Bounds_getNFV( _THIS->bounds );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t S t a t u s
 | 
						|
 */
 | 
						|
static inline QProblemStatus QProblemB_getStatus( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return _THIS->status;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	i s I n i t i a l i s e d
 | 
						|
 */
 | 
						|
static inline BooleanType QProblemB_isInitialised( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	if ( _THIS->status == QPS_NOTINITIALISED )
 | 
						|
		return BT_FALSE;
 | 
						|
	else
 | 
						|
		return BT_TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	i s S o l v e d
 | 
						|
 */
 | 
						|
static inline BooleanType QProblemB_isSolved( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	if ( _THIS->status == QPS_SOLVED )
 | 
						|
		return BT_TRUE;
 | 
						|
	else
 | 
						|
		return BT_FALSE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	i s I n f e a s i b l e
 | 
						|
 */
 | 
						|
static inline BooleanType QProblemB_isInfeasible( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return _THIS->infeasible;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	i s U n b o u n d e d
 | 
						|
 */
 | 
						|
static inline BooleanType QProblemB_isUnbounded( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return _THIS->unbounded;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t H e s s i a n T y p e
 | 
						|
 */
 | 
						|
static inline HessianType QProblemB_getHessianType( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return _THIS->hessianType;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	s e t H e s s i a n T y p e
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_setHessianType( QProblemB* _THIS, HessianType _hessianType )
 | 
						|
{
 | 
						|
	_THIS->hessianType = _hessianType;
 | 
						|
	return SUCCESSFUL_RETURN;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	u s i n g R e g u l a r i s a t i o n
 | 
						|
 */
 | 
						|
static inline BooleanType QProblemB_usingRegularisation( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	if ( _THIS->regVal > QPOASES_ZERO )
 | 
						|
		return BT_TRUE;
 | 
						|
	else
 | 
						|
		return BT_FALSE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t O p t i o n s
 | 
						|
 */
 | 
						|
static inline Options QProblemB_getOptions( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return _THIS->options;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	s e t O p t i o n s
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_setOptions(	QProblemB* _THIS,
 | 
						|
												Options _options
 | 
						|
												)
 | 
						|
{
 | 
						|
	OptionsCPY( &_options,&(_THIS->options) );
 | 
						|
	Options_ensureConsistency( &(_THIS->options) );
 | 
						|
 | 
						|
	QProblemB_setPrintLevel( _THIS,_THIS->options.printLevel );
 | 
						|
 | 
						|
	return SUCCESSFUL_RETURN;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t P r i n t L e v e l
 | 
						|
 */
 | 
						|
static inline PrintLevel QProblemB_getPrintLevel( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return _THIS->options.printLevel;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	g e t C o u n t
 | 
						|
 */
 | 
						|
static inline unsigned int QProblemB_getCount( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	return _THIS->count;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	r e s e t C o u n t e r
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_resetCounter( QProblemB* _THIS )
 | 
						|
{
 | 
						|
	_THIS->count = 0;
 | 
						|
	return SUCCESSFUL_RETURN;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*****************************************************************************
 | 
						|
 *  P R O T E C T E D                                                        *
 | 
						|
 *****************************************************************************/
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	s e t H
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_setHM( QProblemB* _THIS, DenseMatrix* H_new )
 | 
						|
{
 | 
						|
	if ( H_new == 0 )
 | 
						|
		return QProblemB_setH( _THIS,(real_t*)0 );
 | 
						|
	else
 | 
						|
		return QProblemB_setH( _THIS,DenseMatrix_getVal(H_new) );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	s e t H
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_setH( QProblemB* _THIS, real_t* const H_new )
 | 
						|
{
 | 
						|
	/* if null pointer is passed, Hessian is set to zero matrix
 | 
						|
	 *                            (or stays identity matrix) */
 | 
						|
	if ( H_new == 0 )
 | 
						|
	{
 | 
						|
		if ( _THIS->hessianType == HST_IDENTITY )
 | 
						|
			return SUCCESSFUL_RETURN;
 | 
						|
 | 
						|
		_THIS->hessianType = HST_ZERO;
 | 
						|
 | 
						|
		_THIS->H = 0;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		DenseMatrixCON( _THIS->H,QProblemB_getNV( _THIS ),QProblemB_getNV( _THIS ),QProblemB_getNV( _THIS ),H_new );
 | 
						|
	}
 | 
						|
 | 
						|
	return SUCCESSFUL_RETURN;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	s e t G
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_setG( QProblemB* _THIS, const real_t* const g_new )
 | 
						|
{
 | 
						|
	unsigned int nV = (unsigned int)QProblemB_getNV( _THIS );
 | 
						|
 | 
						|
	if ( nV == 0 )
 | 
						|
		return THROWERROR( RET_QPOBJECT_NOT_SETUP );
 | 
						|
 | 
						|
	if ( g_new == 0 )
 | 
						|
		return THROWERROR( RET_INVALID_ARGUMENTS );
 | 
						|
 | 
						|
	memcpy( _THIS->g,g_new,nV*sizeof(real_t) );
 | 
						|
 | 
						|
	return SUCCESSFUL_RETURN;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	s e t L B
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_setLB( QProblemB* _THIS, const real_t* const lb_new )
 | 
						|
{
 | 
						|
	unsigned int i;
 | 
						|
	unsigned int nV = (unsigned int)QProblemB_getNV( _THIS );
 | 
						|
 | 
						|
	if ( nV == 0 )
 | 
						|
		return THROWERROR( RET_QPOBJECT_NOT_SETUP );
 | 
						|
 | 
						|
	if ( lb_new != 0 )
 | 
						|
	{
 | 
						|
		memcpy( _THIS->lb,lb_new,nV*sizeof(real_t) );
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		/* if no lower bounds are specified, set them to -infinity */
 | 
						|
		for( i=0; i<nV; ++i )
 | 
						|
			_THIS->lb[i] = -QPOASES_INFTY;
 | 
						|
	}
 | 
						|
 | 
						|
	return SUCCESSFUL_RETURN;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	s e t L B
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_setLBn( QProblemB* _THIS, int number, real_t value )
 | 
						|
{
 | 
						|
	int nV = QProblemB_getNV( _THIS );
 | 
						|
 | 
						|
	if ( nV == 0 )
 | 
						|
		return THROWERROR( RET_QPOBJECT_NOT_SETUP );
 | 
						|
 | 
						|
	if ( ( number >= 0 ) && ( number < nV ) )
 | 
						|
	{
 | 
						|
		_THIS->lb[number] = value;
 | 
						|
		return SUCCESSFUL_RETURN;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	s e t U B
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_setUB( QProblemB* _THIS, const real_t* const ub_new )
 | 
						|
{
 | 
						|
	unsigned int i;
 | 
						|
	unsigned int nV = (unsigned int)QProblemB_getNV( _THIS );
 | 
						|
 | 
						|
	if ( nV == 0 )
 | 
						|
		return THROWERROR( RET_QPOBJECT_NOT_SETUP );
 | 
						|
 | 
						|
	if ( ub_new != 0 )
 | 
						|
	{
 | 
						|
		memcpy( _THIS->ub,ub_new,nV*sizeof(real_t) );
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		/* if no upper bounds are specified, set them to infinity */
 | 
						|
		for( i=0; i<nV; ++i )
 | 
						|
			_THIS->ub[i] = QPOASES_INFTY;
 | 
						|
	}
 | 
						|
 | 
						|
	return SUCCESSFUL_RETURN;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	s e t U B
 | 
						|
 */
 | 
						|
static inline returnValue QProblemB_setUBn( QProblemB* _THIS, int number, real_t value )
 | 
						|
{
 | 
						|
	int nV = QProblemB_getNV( _THIS );
 | 
						|
 | 
						|
	if ( nV == 0 )
 | 
						|
		return THROWERROR( RET_QPOBJECT_NOT_SETUP );
 | 
						|
 | 
						|
	if ( ( number >= 0 ) && ( number < nV ) )
 | 
						|
	{
 | 
						|
		_THIS->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
 | 
						|
 */
 | 
						|
static inline void QProblemB_computeGivens(	real_t xold, real_t yold,
 | 
						|
											real_t* xnew, real_t* ynew, real_t* c, real_t* s
 | 
						|
											)
 | 
						|
{
 | 
						|
	real_t t, mu;
 | 
						|
 | 
						|
	if ( fabs( yold ) <= QPOASES_ZERO )
 | 
						|
	{
 | 
						|
		*c = 1.0;
 | 
						|
		*s = 0.0;
 | 
						|
 | 
						|
		*xnew = xold;
 | 
						|
		*ynew = yold;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		mu = fabs( xold );
 | 
						|
		if ( fabs( yold ) > mu )
 | 
						|
			mu = fabs( 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
 | 
						|
 */
 | 
						|
static inline void QProblemB_applyGivens(	real_t c, real_t s, real_t nu, real_t xold, real_t yold,
 | 
						|
											real_t* xnew, real_t* ynew
 | 
						|
											)
 | 
						|
{
 | 
						|
	#ifdef __USE_THREE_MULTS_GIVENS__
 | 
						|
 | 
						|
	/* Givens plane rotation requiring only three multiplications,
 | 
						|
	 * cf. Hammarling, S.: A note on modifications to the givens plane rotation.
 | 
						|
	 * J. Inst. Maths Applics, 13:215-218, 1974. */
 | 
						|
	*xnew = xold*c + yold*s;
 | 
						|
	*ynew = (*xnew+xold)*nu - yold;
 | 
						|
 | 
						|
	#else
 | 
						|
 | 
						|
	/* Usual Givens plane rotation requiring four multiplications. */
 | 
						|
	*xnew =  c*xold + s*yold;
 | 
						|
	*ynew = -s*xold + c*yold;
 | 
						|
 | 
						|
	#endif
 | 
						|
 | 
						|
	return;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * i s B l o c k i n g
 | 
						|
 */
 | 
						|
static inline BooleanType QProblemB_isBlocking(	QProblemB* _THIS,
 | 
						|
												real_t num,
 | 
						|
												real_t den,
 | 
						|
												real_t epsNum,
 | 
						|
												real_t epsDen,
 | 
						|
												real_t* t
 | 
						|
												)
 | 
						|
{
 | 
						|
	if ( ( den >= epsDen ) && ( num >= epsNum ) )
 | 
						|
	{
 | 
						|
		if ( num < (*t)*den )
 | 
						|
			return BT_TRUE;
 | 
						|
	}
 | 
						|
 | 
						|
	return BT_FALSE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
END_NAMESPACE_QPOASES
 | 
						|
 | 
						|
 | 
						|
#endif	/* QPOASES_QPROBLEMB_H */
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 *	end of file
 | 
						|
 */
 | 
						|
 |