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.
		
		
		
		
			
				
					2370 lines
				
				99 KiB
			
		
		
			
		
	
	
					2370 lines
				
				99 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	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/QProblem.h
							 | 
						||
| 
								 | 
							
								 *	\author Hans Joachim Ferreau, Andreas Potschka, Christian Kirches
							 | 
						||
| 
								 | 
							
								 *	\version 3.1embedded
							 | 
						||
| 
								 | 
							
								 *	\date 2007-2015
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *	Declaration of the QProblem class which is able to use the newly
							 | 
						||
| 
								 | 
							
								 *	developed online active set strategy for parametric quadratic programming.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef QPOASES_QPROBLEM_H
							 | 
						||
| 
								 | 
							
								#define QPOASES_QPROBLEM_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <qpOASES_e/Bounds.h>
							 | 
						||
| 
								 | 
							
								#include <qpOASES_e/Options.h>
							 | 
						||
| 
								 | 
							
								#include <qpOASES_e/Matrices.h>
							 | 
						||
| 
								 | 
							
								#include <qpOASES_e/Constraints.h>
							 | 
						||
| 
								 | 
							
								#include <qpOASES_e/Flipper.h>
							 | 
						||
| 
								 | 
							
								#include <qpOASES_e/ConstraintProduct.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								BEGIN_NAMESPACE_QPOASES
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
									Bounds *auxiliaryBounds;
							 | 
						||
| 
								 | 
							
									Constraints *auxiliaryConstraints;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *ub_new_far;
							 | 
						||
| 
								 | 
							
									real_t *lb_new_far;
							 | 
						||
| 
								 | 
							
									real_t *ubA_new_far;
							 | 
						||
| 
								 | 
							
									real_t *lbA_new_far;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *g_new;
							 | 
						||
| 
								 | 
							
									real_t *lb_new;
							 | 
						||
| 
								 | 
							
									real_t *ub_new;
							 | 
						||
| 
								 | 
							
									real_t *lbA_new;
							 | 
						||
| 
								 | 
							
									real_t *ubA_new;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *g_new2;
							 | 
						||
| 
								 | 
							
									real_t *lb_new2;
							 | 
						||
| 
								 | 
							
									real_t *ub_new2;
							 | 
						||
| 
								 | 
							
									real_t *lbA_new2;
							 | 
						||
| 
								 | 
							
									real_t *ubA_new2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *delta_xFX5;
							 | 
						||
| 
								 | 
							
									real_t *delta_xFR5;
							 | 
						||
| 
								 | 
							
									real_t *delta_yAC5;
							 | 
						||
| 
								 | 
							
									real_t *delta_yFX5;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *Hx;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *_H;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *g_original;
							 | 
						||
| 
								 | 
							
									real_t *lb_original;
							 | 
						||
| 
								 | 
							
									real_t *ub_original;
							 | 
						||
| 
								 | 
							
									real_t *lbA_original;
							 | 
						||
| 
								 | 
							
									real_t *ubA_original;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *delta_xFR;
							 | 
						||
| 
								 | 
							
									real_t *delta_xFX;
							 | 
						||
| 
								 | 
							
									real_t *delta_yAC;
							 | 
						||
| 
								 | 
							
									real_t *delta_yFX;
							 | 
						||
| 
								 | 
							
									real_t *delta_g;
							 | 
						||
| 
								 | 
							
									real_t *delta_lb;
							 | 
						||
| 
								 | 
							
									real_t *delta_ub;
							 | 
						||
| 
								 | 
							
									real_t *delta_lbA;
							 | 
						||
| 
								 | 
							
									real_t *delta_ubA;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *gMod;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *aFR;
							 | 
						||
| 
								 | 
							
									real_t *wZ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *delta_g2;
							 | 
						||
| 
								 | 
							
									real_t *delta_xFX2;
							 | 
						||
| 
								 | 
							
									real_t *delta_xFR2;
							 | 
						||
| 
								 | 
							
									real_t *delta_yAC2;
							 | 
						||
| 
								 | 
							
									real_t *delta_yFX2;
							 | 
						||
| 
								 | 
							
									real_t *nul;
							 | 
						||
| 
								 | 
							
									real_t *Arow;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *xiC;
							 | 
						||
| 
								 | 
							
									real_t *xiC_TMP;
							 | 
						||
| 
								 | 
							
									real_t *xiB;
							 | 
						||
| 
								 | 
							
									real_t *Arow2;
							 | 
						||
| 
								 | 
							
									real_t *num;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *w;
							 | 
						||
| 
								 | 
							
									real_t *tmp;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *delta_g3;
							 | 
						||
| 
								 | 
							
									real_t *delta_xFX3;
							 | 
						||
| 
								 | 
							
									real_t *delta_xFR3;
							 | 
						||
| 
								 | 
							
									real_t *delta_yAC3;
							 | 
						||
| 
								 | 
							
									real_t *delta_yFX3;
							 | 
						||
| 
								 | 
							
									real_t *nul2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *xiC2;
							 | 
						||
| 
								 | 
							
									real_t *xiC_TMP2;
							 | 
						||
| 
								 | 
							
									real_t *xiB2;
							 | 
						||
| 
								 | 
							
									real_t *num2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *Hz;
							 | 
						||
| 
								 | 
							
									real_t *z;
							 | 
						||
| 
								 | 
							
									real_t *ZHz;
							 | 
						||
| 
								 | 
							
									real_t *r;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *tmp2;
							 | 
						||
| 
								 | 
							
									real_t *Hz2;
							 | 
						||
| 
								 | 
							
									real_t *z2;
							 | 
						||
| 
								 | 
							
									real_t *r2;
							 | 
						||
| 
								 | 
							
									real_t *rhs;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *delta_xFX4;
							 | 
						||
| 
								 | 
							
									real_t *delta_xFR4;
							 | 
						||
| 
								 | 
							
									real_t *delta_yAC4;
							 | 
						||
| 
								 | 
							
									real_t *delta_yFX4;
							 | 
						||
| 
								 | 
							
									real_t *nul3;
							 | 
						||
| 
								 | 
							
									real_t *ek;
							 | 
						||
| 
								 | 
							
									real_t *x_W;
							 | 
						||
| 
								 | 
							
									real_t *As;
							 | 
						||
| 
								 | 
							
									real_t *Ax_W;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *num3;
							 | 
						||
| 
								 | 
							
									real_t *den;
							 | 
						||
| 
								 | 
							
									real_t *delta_Ax_l;
							 | 
						||
| 
								 | 
							
									real_t *delta_Ax_u;
							 | 
						||
| 
								 | 
							
									real_t *delta_Ax;
							 | 
						||
| 
								 | 
							
									real_t *delta_x;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *_A;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *grad;
							 | 
						||
| 
								 | 
							
									real_t *AX;
							 | 
						||
| 
								 | 
							
								} QProblem_ws;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int QProblem_ws_calculateMemorySize( unsigned int nV, unsigned int nC );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								char *QProblem_ws_assignMemory( unsigned int nV, unsigned int nC, QProblem_ws **mem, void *raw_memory );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								QProblem_ws *QProblem_ws_createMemory( unsigned int nV, unsigned int nC );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 *	\brief Implements the online active set strategy for QPs with general constraints.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *	A class for setting up and solving quadratic programs. The main feature is
							 | 
						||
| 
								 | 
							
								 *	the possibily 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
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									QProblem_ws *ws;				/**< Workspace */
							 | 
						||
| 
								 | 
							
									Bounds *bounds;					/**< Data structure for problem's bounds. */
							 | 
						||
| 
								 | 
							
									Constraints *constraints;		/**< Data structure for problem's constraints. */
							 | 
						||
| 
								 | 
							
									Flipper *flipper;				/**< Struct for making a temporary copy of the matrix factorisations. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									DenseMatrix* H;					/**< Hessian matrix pointer. */
							 | 
						||
| 
								 | 
							
									DenseMatrix* A;					/**< Constraint 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 *lbA;					/**< Lower constraints' bound vector. */
							 | 
						||
| 
								 | 
							
									real_t *ubA;					/**< Upper constraints' bound vector. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *R;						/**< Cholesky factor of H (i.e. H = R^T*R). */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *T;						/**< Reverse triangular matrix, A = [0 T]*Q'. */
							 | 
						||
| 
								 | 
							
									real_t *Q;						/**< Orthonormal quadratic matrix, A = [0 T]*Q'. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *Ax;						/**< Stores the current A*x \n
							 | 
						||
| 
								 | 
							
																	 *	 (for increased efficiency only). */
							 | 
						||
| 
								 | 
							
									real_t *Ax_l;					/**< Stores the current distance to lower constraints' bounds A*x-lbA \n
							 | 
						||
| 
								 | 
							
																	 *	 (for increased efficiency only). */
							 | 
						||
| 
								 | 
							
									real_t *Ax_u;					/**< Stores the current distance to lower constraints' bounds ubA-A*x \n
							 | 
						||
| 
								 | 
							
																	 *	 (for increased efficiency only). */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *x;						/**< Primal solution vector. */
							 | 
						||
| 
								 | 
							
									real_t *y;						/**< Dual solution vector. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									real_t *delta_xFR_TMP;			/**< Temporary for determineStepDirection */
							 | 
						||
| 
								 | 
							
									real_t *tempA;					/**< Temporary for determineStepDirection. */
							 | 
						||
| 
								 | 
							
									real_t *tempB;					/**< Temporary for determineStepDirection. */
							 | 
						||
| 
								 | 
							
									real_t *ZFR_delta_xFRz;			/**< Temporary for determineStepDirection. */
							 | 
						||
| 
								 | 
							
									real_t *delta_xFRy;				/**< Temporary for determineStepDirection. */
							 | 
						||
| 
								 | 
							
									real_t *delta_xFRz;				/**< Temporary for determineStepDirection. */
							 | 
						||
| 
								 | 
							
									real_t *delta_yAC_TMP;			/**< Temporary for determineStepDirection. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									ConstraintProduct constraintProduct;	/**< Pointer to user-defined constraint product function. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									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!). */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									int sizeT;						/**< Matrix T is stored in a (sizeT x sizeT) array. */
							 | 
						||
| 
								 | 
							
								} QProblem;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int QProblem_calculateMemorySize( unsigned int nV, unsigned int nC );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								char *QProblem_assignMemory( unsigned int nV, unsigned int nC, QProblem **mem, void *raw_memory );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								QProblem *QProblem_createMemory( unsigned int nV, unsigned int nC );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** 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 QProblemCON(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
													int _nV,	  					/**< Number of variables. */
							 | 
						||
| 
								 | 
							
													int _nC,		  				/**< Number of constraints. */
							 | 
						||
| 
								 | 
							
													HessianType _hessianType 		/**< Type of Hessian matrix. */
							 | 
						||
| 
								 | 
							
													);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Copies all members from given rhs object.
							 | 
						||
| 
								 | 
							
								 *  \return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								void QProblemCPY(	QProblem* FROM,
							 | 
						||
| 
								 | 
							
													QProblem* TO
							 | 
						||
| 
								 | 
							
													);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Clears all data structures of QProblem except for QP data.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
											RET_RESET_FAILED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_reset( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Initialises a 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_TQ \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 QProblem_initM(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
															DenseMatrix *_H,			/**< Hessian matrix. */
							 | 
						||
| 
								 | 
							
															const real_t* const _g, 	/**< Gradient vector. */
							 | 
						||
| 
								 | 
							
															DenseMatrix *_A,  			/**< Constraint matrix. */
							 | 
						||
| 
								 | 
							
															const real_t* const _lb,	/**< Lower bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																							 If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _ub,	/**< Upper bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																							 If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _lbA,	/**< Lower constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																							 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _ubA,	/**< Upper constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																							 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															int* nWSR,					/**< Input: Maximum number of working set recalculations when using initial homotopy.
							 | 
						||
| 
								 | 
							
																							 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 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_TQ \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 QProblem_init(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
															real_t* const _A,  			/**< Constraint matrix. */
							 | 
						||
| 
								 | 
							
															const real_t* const _lb,	/**< Lower bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																							 If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _ub,	/**< Upper bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																							 If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _lbA,	/**< Lower constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																							 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _ubA,	/**< Upper constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																							 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															int* nWSR,					/**< Input: Maximum number of working set recalculations when using initial homotopy.
							 | 
						||
| 
								 | 
							
																							 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 QP problem with given QP data to be read from files 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_TQ \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 QProblem_initF(	QProblem* _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 A_file,	/**< Name of file where constraint matrix 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. */
							 | 
						||
| 
								 | 
							
															const char* const lbA_file,	/**< Name of file where lower constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																							If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const char* const ubA_file,	/**< Name of file where upper constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																							 If no upper constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															int* nWSR,					/**< Input: Maximum number of working set recalculations when using initial homotopy.
							 | 
						||
| 
								 | 
							
																							 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 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/gC empty (or all implicit equality bounds), \n
							 | 
						||
| 
								 | 
							
								 *	2. xOpt, 0,    0    : starts with xOpt, yOpt = 0 and obtain gB/gC by "clipping", \n
							 | 
						||
| 
								 | 
							
								 *	3. 0,    yOpt, 0    : starts with xOpt = 0, yOpt and obtain gB/gC from yOpt != 0, \n
							 | 
						||
| 
								 | 
							
								 *	4. 0,    0,    gB/gC: starts with xOpt = 0, yOpt = 0 and gB/gC, \n
							 | 
						||
| 
								 | 
							
								 *	5. xOpt, yOpt, 0    : starts with xOpt, yOpt and obtain gB/gC from yOpt != 0, \n
							 | 
						||
| 
								 | 
							
								 *	6. xOpt, 0,    gB/gC: starts with xOpt, yOpt = 0 and gB/gC, \n
							 | 
						||
| 
								 | 
							
								 *	7. xOpt, yOpt, gB/gC: starts with xOpt, yOpt and gB/gC (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_TQ \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 QProblem_initMW(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																DenseMatrix *_H, 						/**< Hessian matrix. \n
							 | 
						||
| 
								 | 
							
																						    				 If Hessian matrix is trivial, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const real_t* const _g, 				/**< Gradient vector. */
							 | 
						||
| 
								 | 
							
																DenseMatrix *_A, 			 			/**< Constraint matrix. */
							 | 
						||
| 
								 | 
							
																const real_t* const _lb,				/**< Lower bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																											 If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const real_t* const _ub,				/**< Upper bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																											 If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const real_t* const _lbA,				/**< Lower constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																											 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const real_t* const _ubA,				/**< Upper constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																											 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																int* nWSR,								/**< Input: Maximum number of working set recalculations when using initial homotopy.
							 | 
						||
| 
								 | 
							
																										 *	 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. \n
							 | 
						||
| 
								 | 
							
																											 (If a null pointer is passed, the old primal solution is kept!) */
							 | 
						||
| 
								 | 
							
																const real_t* const yOpt,				/**< Optimal dual solution vector. \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). */
							 | 
						||
| 
								 | 
							
																Constraints* const guessedConstraints,	/**< Optimal working set of constraints for solution (xOpt,yOpt). */
							 | 
						||
| 
								 | 
							
																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 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/gC empty (or all implicit equality bounds), \n
							 | 
						||
| 
								 | 
							
								 *	2. xOpt, 0,    0    : starts with xOpt, yOpt = 0 and obtain gB/gC by "clipping", \n
							 | 
						||
| 
								 | 
							
								 *	3. 0,    yOpt, 0    : starts with xOpt = 0, yOpt and obtain gB/gC from yOpt != 0, \n
							 | 
						||
| 
								 | 
							
								 *	4. 0,    0,    gB/gC: starts with xOpt = 0, yOpt = 0 and gB/gC, \n
							 | 
						||
| 
								 | 
							
								 *	5. xOpt, yOpt, 0    : starts with xOpt, yOpt and obtain gB/gC from yOpt != 0, \n
							 | 
						||
| 
								 | 
							
								 *	6. xOpt, 0,    gB/gC: starts with xOpt, yOpt = 0 and gB/gC, \n
							 | 
						||
| 
								 | 
							
								 *	7. xOpt, yOpt, gB/gC: starts with xOpt, yOpt and gB/gC (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_TQ \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 QProblem_initW(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
															real_t* const _A,  						/**< Constraint matrix. */
							 | 
						||
| 
								 | 
							
															const real_t* const _lb,				/**< Lower bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																										 If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _ub,				/**< Upper bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																										 If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _lbA,				/**< Lower constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																										 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															const real_t* const _ubA,				/**< Upper constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																									 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
															int* nWSR,								/**< Input:  Maximum number of working set recalculations when using initial homotopy.
							 | 
						||
| 
								 | 
							
																									 *	 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. \n
							 | 
						||
| 
								 | 
							
																										 (If a null pointer is passed, the old primal solution is kept!) */
							 | 
						||
| 
								 | 
							
															const real_t* const yOpt,				/**< Optimal dual solution vector. \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). */
							 | 
						||
| 
								 | 
							
															Constraints* const guessedConstraints,	/**< Optimal working set of constraints for solution (xOpt,yOpt). */
							 | 
						||
| 
								 | 
							
															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 QP problem with given QP data to be ream from files 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/gC empty (or all implicit equality bounds), \n
							 | 
						||
| 
								 | 
							
								 *	2. xOpt, 0,    0    : starts with xOpt, yOpt = 0 and obtain gB/gC by "clipping", \n
							 | 
						||
| 
								 | 
							
								 *	3. 0,    yOpt, 0    : starts with xOpt = 0, yOpt and obtain gB/gC from yOpt != 0, \n
							 | 
						||
| 
								 | 
							
								 *	4. 0,    0,    gB/gC: starts with xOpt = 0, yOpt = 0 and gB/gC, \n
							 | 
						||
| 
								 | 
							
								 *	5. xOpt, yOpt, 0    : starts with xOpt, yOpt and obtain gB/gC from yOpt != 0, \n
							 | 
						||
| 
								 | 
							
								 *	6. xOpt, 0,    gB/gC: starts with xOpt, yOpt = 0 and gB/gC, \n
							 | 
						||
| 
								 | 
							
								 *	7. xOpt, yOpt, gB/gC: starts with xOpt, yOpt and gB/gC (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_TQ \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 QProblem_initFW(	QProblem* _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 A_file,				/**< Name of file where constraint matrix 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. */
							 | 
						||
| 
								 | 
							
																const char* const lbA_file,				/**< Name of file where lower constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																											 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const char* const ubA_file,				/**< Name of file where upper constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																											 If no upper constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																int* nWSR,								/**< Input:  Maximum number of working set recalculations when using initial homotopy.
							 | 
						||
| 
								 | 
							
																											 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. \n
							 | 
						||
| 
								 | 
							
																											 (If a null pointer is passed, the old primal solution is kept!) */
							 | 
						||
| 
								 | 
							
																const real_t* const yOpt,				/**< Optimal dual solution vector. \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). */
							 | 
						||
| 
								 | 
							
																Constraints* const guessedConstraints,	/**< Optimal working set of constraints for solution (xOpt,yOpt). */
							 | 
						||
| 
								 | 
							
																const char* const R_file				/**< 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!) */
							 | 
						||
| 
								 | 
							
																);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Solves an initialised QP sequence using the online active set strategy.
							 | 
						||
| 
								 | 
							
								 *	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 QProblem_hotstart(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																const real_t* const lbA_new,	/**< Lower constraints' bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																			 			 			 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const real_t* const ubA_new,	/**< Upper constraints' bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																			 			 			 If no upper constraints' 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 QProblem_hotstartF(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																const char* const lbA_file, /**< Name of file where lower constraints' bounds, of neighbouring QP to be solved, is stored. \n
							 | 
						||
| 
								 | 
							
																			 					 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const char* const ubA_file, /**< Name of file where upper constraints' bounds, of neighbouring QP to be solved, is stored. \n
							 | 
						||
| 
								 | 
							
																			 					 If no upper constraints' 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 QProblem_hotstartW(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																const real_t* const lbA_new,			/**< Lower constraints' bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																			 						 		 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const real_t* const ubA_new,			/**< Upper constraints' bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																			 								 If no upper constraints' 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 of bounds is kept!) */
							 | 
						||
| 
								 | 
							
																Constraints* const guessedConstraints	/**< Optimal working set of constraints for solution (xOpt,yOpt). \n
							 | 
						||
| 
								 | 
							
																											 (If a null pointer is passed, the previous working set of constraints 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_SETUP_AUXILIARYQP_FAILED \n
							 | 
						||
| 
								 | 
							
											RET_UNABLE_TO_READ_FILE \n
							 | 
						||
| 
								 | 
							
											RET_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_hotstartFW(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																	const char* const lbA_file, 			/**< Name of file where lower constraints' bounds, of neighbouring QP to be solved, is stored. \n
							 | 
						||
| 
								 | 
							
																			 									 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const char* const ubA_file, 			/**< Name of file where upper constraints' bounds, of neighbouring QP to be solved, is stored. \n
							 | 
						||
| 
								 | 
							
																			 									 If no upper constraints' 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 of bounds is kept!) */
							 | 
						||
| 
								 | 
							
																	Constraints* const guessedConstraints	/**< Optimal working set of constraints for solution (xOpt,yOpt). \n
							 | 
						||
| 
								 | 
							
																												 (If a null pointer is passed, the previous working set of constraints is kept!) */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Solves using the current working set
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 *			RET_STEPDIRECTION_FAILED_TQ \n
							 | 
						||
| 
								 | 
							
								 *			RET_STEPDIRECTION_FAILED_CHOLESKY \n
							 | 
						||
| 
								 | 
							
								 *			RET_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_solveCurrentEQP (	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		const int n_rhs,		/**< Number of consecutive right hand sides */
							 | 
						||
| 
								 | 
							
																		const real_t* g_in,		/**< Gradient of neighbouring QP to be solved. */
							 | 
						||
| 
								 | 
							
																		const real_t* lb_in,	/**< Lower bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																									 If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																		const real_t* ub_in,	/**< Upper bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																									 If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																		const real_t* lbA_in,	/**< Lower constraints' bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																									 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																		const real_t* ubA_in,	/**< Upper constraints' bounds of neighbouring QP to be solved. \n */
							 | 
						||
| 
								 | 
							
																		real_t* x_out,			/**< Output: Primal solution */
							 | 
						||
| 
								 | 
							
																		real_t* y_out			/**< Output: Dual solution */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns current constraints object of the QP (deep copy).
							 | 
						||
| 
								 | 
							
								  *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								  			RET_QPOBJECT_NOT_SETUP */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_getConstraints(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																					Constraints* _constraints	/** Output: Constraints object. */
							 | 
						||
| 
								 | 
							
																					);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the number of constraints.
							 | 
						||
| 
								 | 
							
								 *	\return Number of constraints. */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNC( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the number of (implicitly defined) equality constraints.
							 | 
						||
| 
								 | 
							
								 *	\return Number of (implicitly defined) equality constraints. */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNEC( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the number of active constraints.
							 | 
						||
| 
								 | 
							
								 *	\return Number of active constraints. */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNAC( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the number of inactive constraints.
							 | 
						||
| 
								 | 
							
								 *	\return Number of inactive constraints. */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNIAC( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the dimension of null space.
							 | 
						||
| 
								 | 
							
								 *	\return Dimension of null space. */
							 | 
						||
| 
								 | 
							
								int QProblem_getNZ( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the dual solution vector (deep copy).
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
											RET_QP_NOT_SOLVED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_getDualSolution(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		real_t* const yOpt	/**< Output: Dual solution vector (if QP has been solved). */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Defines user-defined routine for calculating the constraint product A*x
							 | 
						||
| 
								 | 
							
								 *	\return  SUCCESSFUL_RETURN \n */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setConstraintProduct(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			ConstraintProduct _constraintProduct
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Prints concise list of properties of the current QP.
							 | 
						||
| 
								 | 
							
								 *	\return  SUCCESSFUL_RETURN \n */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_printProperties( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Writes a vector with the state of the working set
							 | 
						||
| 
								 | 
							
								*	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_getWorkingSet(	QProblem* _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 QProblem_getWorkingSetBounds(	QProblem* _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 QProblem_getWorkingSetConstraints(	QProblem* _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 QProblem_getBounds(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																				Bounds* _bounds		/** Output: Bounds object. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the number of variables.
							 | 
						||
| 
								 | 
							
								 *	\return Number of variables. */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNV( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the number of free variables.
							 | 
						||
| 
								 | 
							
								 *	\return Number of free variables. */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNFR( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the number of fixed variables.
							 | 
						||
| 
								 | 
							
								 *	\return Number of fixed variables. */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNFX( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the number of implicitly fixed variables.
							 | 
						||
| 
								 | 
							
								 *	\return Number of implicitly fixed variables. */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNFV( QProblem* _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 QProblem_getObjVal( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the objective function value at an arbitrary point x.
							 | 
						||
| 
								 | 
							
								 *	\return Objective function value at point x */
							 | 
						||
| 
								 | 
							
								real_t QProblem_getObjValX(	QProblem* _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 QProblem_getPrimalSolution(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		real_t* const xOpt	/**< Output: Primal solution vector (if QP has been solved). */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns status of the solution process.
							 | 
						||
| 
								 | 
							
								 *	\return Status of solution process. */
							 | 
						||
| 
								 | 
							
								static inline QProblemStatus QProblem_getStatus( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns if the QProblem object is initialised.
							 | 
						||
| 
								 | 
							
								 *	\return BT_TRUE:  QProblem initialised \n
							 | 
						||
| 
								 | 
							
								 			BT_FALSE: QProblem not initialised */
							 | 
						||
| 
								 | 
							
								static inline BooleanType QProblem_isInitialised( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns if the QP has been solved.
							 | 
						||
| 
								 | 
							
								 *	\return BT_TRUE:  QProblem solved \n
							 | 
						||
| 
								 | 
							
								 			BT_FALSE: QProblem not solved */
							 | 
						||
| 
								 | 
							
								static inline BooleanType QProblem_isSolved( QProblem* _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 QProblem_isInfeasible( QProblem* _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 QProblem_isUnbounded( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns Hessian type flag (type is not determined due to _THIS call!).
							 | 
						||
| 
								 | 
							
								 *	\return Hessian type. */
							 | 
						||
| 
								 | 
							
								static inline HessianType QProblem_getHessianType( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Changes the print level.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setHessianType(	QProblem* _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 QProblem_usingRegularisation( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns current options struct.
							 | 
						||
| 
								 | 
							
								 *	\return Current options struct. */
							 | 
						||
| 
								 | 
							
								static inline Options QProblem_getOptions( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Overrides current options with given ones.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setOptions(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																				Options _options	/**< New options. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the print level.
							 | 
						||
| 
								 | 
							
								 *	\return Print level. */
							 | 
						||
| 
								 | 
							
								static inline PrintLevel QProblem_getPrintLevel( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Changes the print level.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setPrintLevel(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																	PrintLevel _printlevel	/**< New print level. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Returns the current number of QP problems solved.
							 | 
						||
| 
								 | 
							
								 *	\return Number of QP problems solved. */
							 | 
						||
| 
								 | 
							
								static inline unsigned int QProblem_getCount( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Resets QP problem counter (to zero).
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN. */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_resetCounter( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Prints a list of all options and their current values.
							 | 
						||
| 
								 | 
							
								 *	\return  SUCCESSFUL_RETURN \n */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_printOptions( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Solves a QProblem whose QP data is assumed to be stored in the member variables.
							 | 
						||
| 
								 | 
							
								 *  A guess for its primal/dual optimal solution vectors and the corresponding
							 | 
						||
| 
								 | 
							
								 *  working sets of bounds and constraints 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_TQ \n
							 | 
						||
| 
								 | 
							
											RET_INIT_FAILED_HOTSTART \n
							 | 
						||
| 
								 | 
							
											RET_INIT_FAILED_INFEASIBILITY \n
							 | 
						||
| 
								 | 
							
											RET_INIT_FAILED_UNBOUNDEDNESS \n
							 | 
						||
| 
								 | 
							
											RET_MAX_NWSR_REACHED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_solveInitialQP(	QProblem* _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). */
							 | 
						||
| 
								 | 
							
																		Constraints* const guessedConstraints,	/**< Optimal working set of constraints 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 QProblem 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 QProblem_solveQP(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																const real_t* const lbA_new,	/**< Lower constraints' bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																			 			 			 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																const real_t* const ubA_new,	/**< Upper constraints' bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																			 			 			 If no upper constraints' 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 QProblem 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 QProblem_solveRegularisedQP(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																			const real_t* const lbA_new,	/**< Lower constraints' bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																					 			 				 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																			const real_t* const ubA_new,	/**< Upper constraints' bounds of neighbouring QP to be solved. \n
							 | 
						||
| 
								 | 
							
																					 			 				 If no upper constraints' 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. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Determines type of existing constraints and bounds (i.e. implicitly fixed, unbounded etc.).
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
											RET_SETUPSUBJECTTOTYPE_FAILED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupSubjectToType( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Determines type of new constraints and bounds (i.e. implicitly fixed, unbounded etc.).
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
											RET_SETUPSUBJECTTOTYPE_FAILED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupSubjectToTypeNew(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			const real_t* const lb_new,		/**< New lower bounds. */
							 | 
						||
| 
								 | 
							
																			const real_t* const ub_new,		/**< New upper bounds. */
							 | 
						||
| 
								 | 
							
																			const real_t* const lbA_new,	/**< New lower constraints' bounds. */
							 | 
						||
| 
								 | 
							
																			const real_t* const ubA_new		/**< New upper constraints' bounds. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Computes the Cholesky decomposition of the projected Hessian (i.e. R^T*R = Z^T*H*Z).
							 | 
						||
| 
								 | 
							
								 *  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 QProblem_computeProjectedCholesky( QProblem* _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 QProblem_setupInitialCholesky( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Initialises TQ factorisation of A (i.e. A*Q = [0 T]) if NO constraint is active.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_INDEXLIST_CORRUPTED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupTQfactorisation( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Obtains the desired working set for the auxiliary initial QP in
							 | 
						||
| 
								 | 
							
								 *  accordance with the user specifications
							 | 
						||
| 
								 | 
							
								 *  (assumes that member AX has already been initialised!)
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
											RET_OBTAINING_WORKINGSET_FAILED \n
							 | 
						||
| 
								 | 
							
											RET_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_obtainAuxiliaryWorkingSet(	QProblem* _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 of bounds for solution (xOpt,yOpt). */
							 | 
						||
| 
								 | 
							
																				Constraints* const guessedConstraints,		/**< Guessed working set for solution (xOpt,yOpt). */
							 | 
						||
| 
								 | 
							
																				Bounds* auxiliaryBounds,					/**< Input: Allocated bound object. \n
							 | 
						||
| 
								 | 
							
																															 *	 Ouput: Working set of constraints for auxiliary QP. */
							 | 
						||
| 
								 | 
							
																				Constraints* auxiliaryConstraints			/**< Input: Allocated bound object. \n
							 | 
						||
| 
								 | 
							
																															 *	 Ouput: Working set for auxiliary QP. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Sets up bound and constraints data structures according to auxiliaryBounds/Constraints.
							 | 
						||
| 
								 | 
							
								 *  (If the working set shall be setup afresh, make sure that
							 | 
						||
| 
								 | 
							
								 *  bounds and constraints data structure have been resetted
							 | 
						||
| 
								 | 
							
								 *  and the TQ factorisation has been initialised!)
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
											RET_SETUP_WORKINGSET_FAILED \n
							 | 
						||
| 
								 | 
							
											RET_INVALID_ARGUMENTS \n
							 | 
						||
| 
								 | 
							
											RET_UNKNOWN_BUG */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupAuxiliaryWorkingSet(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																				Bounds* const auxiliaryBounds,				/**< Working set of bounds for auxiliary QP. */
							 | 
						||
| 
								 | 
							
																				Constraints* const auxiliaryConstraints,	/**< Working set of constraints 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 QProblem_setupAuxiliaryQPsolution(	QProblem* _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, CONSTRAINTS have already been initialised!).
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupAuxiliaryQPgradient( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Sets up (constraints') bounds of the auxiliary initial QP for given
							 | 
						||
| 
								 | 
							
								 *  optimal primal/dual solution and given initial working set
							 | 
						||
| 
								 | 
							
								 *  (assumes that members X, Y and BOUNDS, CONSTRAINTS have already been initialised!).
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
											RET_UNKNOWN_BUG */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupAuxiliaryQPbounds(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																				Bounds* const auxiliaryBounds,				/**< Working set of bounds for auxiliary QP. */
							 | 
						||
| 
								 | 
							
																				Constraints* const auxiliaryConstraints,	/**< Working set of constraints for auxiliary QP. */
							 | 
						||
| 
								 | 
							
																				BooleanType useRelaxation					/**< Flag indicating if inactive (constraints') bounds shall be relaxed. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Adds a constraint to active set.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_ADDCONSTRAINT_FAILED \n
							 | 
						||
| 
								 | 
							
											RET_ADDCONSTRAINT_FAILED_INFEASIBILITY \n
							 | 
						||
| 
								 | 
							
											RET_ENSURELI_FAILED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_addConstraint(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																	int number,					/**< Number of constraint to be added to active set. */
							 | 
						||
| 
								 | 
							
																	SubjectToStatus C_status,	/**< Status of new active constraint. */
							 | 
						||
| 
								 | 
							
																	BooleanType updateCholesky,	/**< Flag indicating if Cholesky decomposition shall be updated. */
							 | 
						||
| 
								 | 
							
																	BooleanType ensureLI		/**< Ensure linear independence by exchange rules by default. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Checks if new active constraint to be added is linearly dependent from
							 | 
						||
| 
								 | 
							
								 *	from row of the active constraints matrix.
							 | 
						||
| 
								 | 
							
								 *	\return	 RET_LINEARLY_DEPENDENT \n
							 | 
						||
| 
								 | 
							
								 			 RET_LINEARLY_INDEPENDENT \n
							 | 
						||
| 
								 | 
							
											 RET_INDEXLIST_CORRUPTED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_addConstraint_checkLI(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			int number			/**< Number of constraint to be added to active set. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Ensures linear independence of constraint matrix when a new constraint is added.
							 | 
						||
| 
								 | 
							
								 * 	To _THIS end a bound or constraint is removed simultaneously if necessary.
							 | 
						||
| 
								 | 
							
								 *	\return	 SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			 RET_LI_RESOLVED \n
							 | 
						||
| 
								 | 
							
											 RET_ENSURELI_FAILED \n
							 | 
						||
| 
								 | 
							
											 RET_ENSURELI_FAILED_TQ \n
							 | 
						||
| 
								 | 
							
											 RET_ENSURELI_FAILED_NOINDEX \n
							 | 
						||
| 
								 | 
							
											 RET_REMOVE_FROM_ACTIVESET */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_addConstraint_ensureLI(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																				int number,					/**< Number of constraint to be added to active set. */
							 | 
						||
| 
								 | 
							
																				SubjectToStatus C_status	/**< Status of new active bound. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Adds a bound to active set.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_ADDBOUND_FAILED \n
							 | 
						||
| 
								 | 
							
											RET_ADDBOUND_FAILED_INFEASIBILITY \n
							 | 
						||
| 
								 | 
							
											RET_ENSURELI_FAILED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_addBound(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																BooleanType ensureLI 		/**< Ensure linear independence by exchange rules by default. */
							 | 
						||
| 
								 | 
							
																);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Checks if new active bound to be added is linearly dependent from
							 | 
						||
| 
								 | 
							
								 *	from row of the active constraints matrix.
							 | 
						||
| 
								 | 
							
								 *	\return	 RET_LINEARLY_DEPENDENT \n
							 | 
						||
| 
								 | 
							
								 			 RET_LINEARLY_INDEPENDENT */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_addBound_checkLI(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		int number			/**< Number of bound to be added to active set. */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Ensures linear independence of constraint matrix when a new bound is added.
							 | 
						||
| 
								 | 
							
								 *	To _THIS end a bound or constraint is removed simultaneously if necessary.
							 | 
						||
| 
								 | 
							
								 *	\return	 SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			 RET_LI_RESOLVED \n
							 | 
						||
| 
								 | 
							
											 RET_ENSURELI_FAILED \n
							 | 
						||
| 
								 | 
							
											 RET_ENSURELI_FAILED_TQ \n
							 | 
						||
| 
								 | 
							
											 RET_ENSURELI_FAILED_NOINDEX \n
							 | 
						||
| 
								 | 
							
											 RET_REMOVE_FROM_ACTIVESET */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_addBound_ensureLI(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		int number,					/**< Number of bound to be added to active set. */
							 | 
						||
| 
								 | 
							
																		SubjectToStatus B_status	/**< Status of new active bound. */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Removes a constraint from active set.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_CONSTRAINT_NOT_ACTIVE \n
							 | 
						||
| 
								 | 
							
											RET_REMOVECONSTRAINT_FAILED \n
							 | 
						||
| 
								 | 
							
											RET_HESSIAN_NOT_SPD */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_removeConstraint(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		int number,						/**< Number of constraint to be removed from active set. */
							 | 
						||
| 
								 | 
							
																		BooleanType updateCholesky,		/**< Flag indicating if Cholesky decomposition shall be updated. */
							 | 
						||
| 
								 | 
							
																		BooleanType allowFlipping,		/**< Flag indicating if flipping bounds are allowed. */
							 | 
						||
| 
								 | 
							
																		BooleanType ensureNZC			/**< Flag indicating if non-zero curvature is ensured by exchange rules. */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Removes a bounds from active set.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_BOUND_NOT_ACTIVE \n
							 | 
						||
| 
								 | 
							
											RET_HESSIAN_NOT_SPD \n
							 | 
						||
| 
								 | 
							
											RET_REMOVEBOUND_FAILED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_removeBound(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																	int number,						/**< Number of bound to be removed from active set. */
							 | 
						||
| 
								 | 
							
																	BooleanType updateCholesky,		/**< Flag indicating if Cholesky decomposition shall be updated. */
							 | 
						||
| 
								 | 
							
																	BooleanType allowFlipping,		/**< Flag indicating if flipping bounds are allowed. */
							 | 
						||
| 
								 | 
							
																	BooleanType ensureNZC			/**< Flag indicating if non-zero curvature is ensured by exchange rules. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Performs robustified ratio test yield the maximum possible step length
							 | 
						||
| 
								 | 
							
								 *  along the homotopy path.
							 | 
						||
| 
								 | 
							
								 *	\return  SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_performPlainRatioTest(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			int nIdx, 					/**< Number of ratios to be checked. */
							 | 
						||
| 
								 | 
							
																			const int* const idxList, 	/**< Array containing the indices of all 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. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Ensure non-zero curvature by primal jump.
							 | 
						||
| 
								 | 
							
								 *  \return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 *          RET_HOTSTART_STOPPED_UNBOUNDEDNESS */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_ensureNonzeroCurvature(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																				BooleanType removeBoundNotConstraint,	/**< SubjectTo to be removed is a bound. */
							 | 
						||
| 
								 | 
							
																				int remIdx,								/**< Index of bound/constraint to be removed. */
							 | 
						||
| 
								 | 
							
																				BooleanType* exchangeHappened,			/**< Output: Exchange was necessary to ensure. */
							 | 
						||
| 
								 | 
							
																				BooleanType* addBoundNotConstraint,		/**< SubjectTo to be added is a bound. */
							 | 
						||
| 
								 | 
							
																				int* addIdx,							/**< Index of bound/constraint to be added. */
							 | 
						||
| 
								 | 
							
																				SubjectToStatus* addStatus				/**< Status of bound/constraint to be added. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Solves the system Ta = b or T^Ta = b where T is a reverse upper triangular matrix.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_DIV_BY_ZERO */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_backsolveT(	QProblem* _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 */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Determines step direction of the shift of the QP data.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_determineDataShift(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			const real_t* const g_new,		/**< New gradient vector. */
							 | 
						||
| 
								 | 
							
																			const real_t* const lbA_new,	/**< New lower constraints' bounds. */
							 | 
						||
| 
								 | 
							
																			const real_t* const ubA_new,	/**< New upper constraints' bounds. */
							 | 
						||
| 
								 | 
							
																			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_lbA,		/**< Output: Step direction of lower constraints' bounds. */
							 | 
						||
| 
								 | 
							
																			real_t* const delta_ubA,		/**< Output: Step direction of upper constraints' bounds. */
							 | 
						||
| 
								 | 
							
																			real_t* const delta_lb,	 		/**< Output: Step direction of lower bounds. */
							 | 
						||
| 
								 | 
							
																			real_t* const delta_ub,	 		/**< Output: Step direction of upper bounds. */
							 | 
						||
| 
								 | 
							
																			BooleanType* Delta_bC_isZero,	/**< Output: Indicates if active constraints' bounds are to be shifted. */
							 | 
						||
| 
								 | 
							
																			BooleanType* Delta_bB_isZero	/**< Output: Indicates if active bounds are to be shifted. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Determines step direction of the homotopy path.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			RET_STEPDIRECTION_FAILED_TQ \n
							 | 
						||
| 
								 | 
							
											RET_STEPDIRECTION_FAILED_CHOLESKY */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_determineStepDirection(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																				const real_t* const delta_g,	/**< Step direction of gradient vector. */
							 | 
						||
| 
								 | 
							
																				const real_t* const delta_lbA,	/**< Step direction of lower constraints' bounds. */
							 | 
						||
| 
								 | 
							
																				const real_t* const delta_ubA,	/**< Step direction of upper constraints' bounds. */
							 | 
						||
| 
								 | 
							
																				const real_t* const delta_lb,	/**< Step direction of lower bounds. */
							 | 
						||
| 
								 | 
							
																				const real_t* const delta_ub,	/**< Step direction of upper bounds. */
							 | 
						||
| 
								 | 
							
																				BooleanType Delta_bC_isZero, 	/**< Indicates if active constraints' bounds are to be shifted. */
							 | 
						||
| 
								 | 
							
																				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_yAC, 		/**< Output: Dual homotopy step direction of active constraints' multiplier. */
							 | 
						||
| 
								 | 
							
																				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_ERROR_IN_CONSTRAINTPRODUCT \n
							 | 
						||
| 
								 | 
							
								 * 			RET_QP_INFEASIBLE */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_performStep(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																	const real_t* const delta_g,		/**< Step direction of gradient. */
							 | 
						||
| 
								 | 
							
																	const real_t* const delta_lbA,		/**< Step direction of lower constraints' bounds. */
							 | 
						||
| 
								 | 
							
																	const real_t* const delta_ubA,		/**< Step direction of upper constraints' bounds. */
							 | 
						||
| 
								 | 
							
																	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_yAC,		/**< Dual homotopy step direction of active constraints' multiplier. */
							 | 
						||
| 
								 | 
							
																	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. */
							 | 
						||
| 
								 | 
							
																	BooleanType* BC_isBound 			/**< Output: Indicates if blocking constraint is a bound. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Updates the active set.
							 | 
						||
| 
								 | 
							
								 *	\return  SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 			 RET_REMOVE_FROM_ACTIVESET_FAILED \n
							 | 
						||
| 
								 | 
							
											 RET_ADD_TO_ACTIVESET_FAILED */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_changeActiveSet(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		int BC_idx, 				/**< Index of blocking constraint. */
							 | 
						||
| 
								 | 
							
																		SubjectToStatus BC_status,	/**< Status of blocking constraint. */
							 | 
						||
| 
								 | 
							
																		BooleanType BC_isBound 		/**< Indicates if blocking constraint is a bound. */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Compute relative length of homotopy in data space for termination
							 | 
						||
| 
								 | 
							
								 *  criterion.
							 | 
						||
| 
								 | 
							
								 *  \return Relative length in data space. */
							 | 
						||
| 
								 | 
							
								real_t QProblem_getRelativeHomotopyLength(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																			const real_t* const lbA_new,	/**< Final lower constraint bounds. */
							 | 
						||
| 
								 | 
							
																			const real_t* const ubA_new		/**< Final upper constraint bounds. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Ramping Strategy to avoid ties. Modifies homotopy start without
							 | 
						||
| 
								 | 
							
								 *  changing current active set.
							 | 
						||
| 
								 | 
							
								 *  \return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_performRamping( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** ... */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_updateFarBounds(	QProblem* _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,		/**< ... */
							 | 
						||
| 
								 | 
							
																		const real_t* const lbA_new,	/**< ... */
							 | 
						||
| 
								 | 
							
																		real_t* const lbA_new_far,		/**< ... */
							 | 
						||
| 
								 | 
							
																		const real_t* const ubA_new,	/**< ... */
							 | 
						||
| 
								 | 
							
																		real_t* const ubA_new_far		/**< ... */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** ... */
							 | 
						||
| 
								 | 
							
								returnValue QProblemBCPY_updateFarBounds(	QProblem* _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 QProblem_performRatioTestC(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		int nIdx, 						/**< Number of ratios to be checked. */
							 | 
						||
| 
								 | 
							
																		const int* const idxList, 		/**< Array containing the indices of all ratios to be checked. */
							 | 
						||
| 
								 | 
							
																		Constraints* const subjectTo,	/**< Constraint 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. */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Drift correction at end of each active set iteration
							 | 
						||
| 
								 | 
							
								 *  \return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_performDriftCorrection( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** 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 and constraints.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 *			RET_SETUP_AUXILIARYQP_FAILED \n
							 | 
						||
| 
								 | 
							
											RET_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupAuxiliaryQP(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		Bounds* const guessedBounds,			/**< Initial guess for working set of bounds. */
							 | 
						||
| 
								 | 
							
																		Constraints* const guessedConstraints	/**< Initial guess for working set of constraints. */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** 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 QProblem_shallRefactorise(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		Bounds* const guessedBounds,			/**< Guessed new working set of bounds. */
							 | 
						||
| 
								 | 
							
																		Constraints* const guessedConstraints	/**< Guessed new working set of constraints. */
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Setups internal QP data.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
											RET_INVALID_ARGUMENTS \n
							 | 
						||
| 
								 | 
							
											RET_UNKNONW_BUG */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupQPdataM(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																	DenseMatrix *_H, 			/**< Hessian matrix. \n
							 | 
						||
| 
								 | 
							
																									 If Hessian matrix is trivial,a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _g, 	/**< Gradient vector. */
							 | 
						||
| 
								 | 
							
																	DenseMatrix *_A, 			 /**< Constraint matrix. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _lb,	/**< Lower bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																									 If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _ub,	/**< Upper bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																									 If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _lbA,	/**< Lower constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																									 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _ubA	/**< Upper constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																									 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Sets up dense 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_UNKNONW_BUG */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupQPdata(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																	real_t* const _A,  			/**< Constraint matrix. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _lb,	/**< Lower bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																									 If no lower bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _ub,	/**< Upper bound vector (on variables). \n
							 | 
						||
| 
								 | 
							
																									 If no upper bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _lbA,	/**< Lower constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																									 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																	const real_t* const _ubA	/**< Upper constraints' bound vector. \n
							 | 
						||
| 
								 | 
							
																									 If no lower constraints' 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_UNKNONW_BUG */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_setupQPdataFromFile(	QProblem* _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 A_file,	/**< Name of file where constraint matrix, 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. */
							 | 
						||
| 
								 | 
							
																			const char* const lbA_file, /**< Name of file where lower constraints' bounds, of neighbouring QP to be solved, is stored. \n
							 | 
						||
| 
								 | 
							
																		 			 						 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																			const char* const ubA_file	/**< Name of file where upper constraints' bounds, of neighbouring QP to be solved, is stored. \n
							 | 
						||
| 
								 | 
							
																		 			 						 If no upper constraints' 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 QProblem_loadQPvectorsFromFile(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																			const char* const lbA_file, /**< Name of file where lower constraints' bounds, of neighbouring QP to be solved, is stored. \n
							 | 
						||
| 
								 | 
							
																		 			 						 If no lower constraints' bounds exist, a NULL pointer can be passed. */
							 | 
						||
| 
								 | 
							
																			const char* const ubA_file, /**< Name of file where upper constraints' bounds, of neighbouring QP to be solved, is stored. \n
							 | 
						||
| 
								 | 
							
																		 			 						 If no upper constraints' 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 */
							 | 
						||
| 
								 | 
							
																			real_t* const lbA_new,		/**< Output: Lower constraints' bounds of neighbouring QP to be solved */
							 | 
						||
| 
								 | 
							
																			real_t* const ubA_new		/**< Output: Upper constraints' bounds of neighbouring QP to be solved */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Prints concise information on the current iteration.
							 | 
						||
| 
								 | 
							
								 *	\return  SUCCESSFUL_RETURN \n */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_printIteration(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		int iter,					/**< Number of current iteration. */
							 | 
						||
| 
								 | 
							
																		int BC_idx, 				/**< Index of blocking constraint. */
							 | 
						||
| 
								 | 
							
																		SubjectToStatus BC_status,	/**< Status of blocking constraint. */
							 | 
						||
| 
								 | 
							
																		BooleanType BC_isBound,		/**< Indicates if blocking constraint is a bound. */
							 | 
						||
| 
								 | 
							
																		real_t homotopyLength,		/**< Current homotopy distance. */
							 | 
						||
| 
								 | 
							
																		BooleanType isFirstCall		/**< Indicating whether this is the first call for current QP. */
							 | 
						||
| 
								 | 
							
								 										);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Sets constraint matrix of the QP. \n
							 | 
						||
| 
								 | 
							
									Note: Also internal vector Ax is recomputed!
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 *			RET_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setAM(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			DenseMatrix *A_new	/**< New constraint matrix. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Sets dense constraint matrix of the QP. \n
							 | 
						||
| 
								 | 
							
									Note: Also internal vector Ax is recomputed!
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 *			RET_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setA(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			real_t* const A_new	/**< New dense constraint matrix (with correct dimension!). */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Sets constraints' lower bound vector of the QP.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 *			RET_QPOBJECT_NOT_SETUP */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setLBA(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			const real_t* const lbA_new	/**< New constraints' lower bound vector (with correct dimension!). */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Changes single entry of lower constraints' bound vector of the QP.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN  \n
							 | 
						||
| 
								 | 
							
								 *			RET_QPOBJECT_NOT_SETUP \n
							 | 
						||
| 
								 | 
							
								 *			RET_INDEX_OUT_OF_BOUNDS */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setLBAn(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			int number,		/**< Number of entry to be changed. */
							 | 
						||
| 
								 | 
							
																			real_t value	/**< New value for entry of lower constraints' bound vector (with correct dimension!). */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Sets constraints' upper bound vector of the QP.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 *			RET_QPOBJECT_NOT_SETUP */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setUBA(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			const real_t* const ubA_new	/**< New constraints' upper bound vector (with correct dimension!). */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Changes single entry of upper constraints' bound vector of the QP.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN  \n
							 | 
						||
| 
								 | 
							
								 *			RET_QPOBJECT_NOT_SETUP \n
							 | 
						||
| 
								 | 
							
								 *			RET_INDEX_OUT_OF_BOUNDS */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setUBAn(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			int number,		/**< Number of entry to be changed. */
							 | 
						||
| 
								 | 
							
																			real_t value	/**< New value for entry of upper constraints' bound vector (with correct dimension!). */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Decides if lower bounds are smaller than upper bounds
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * \return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 * 		   RET_QP_INFEASIBLE */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_areBoundsConsistent(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			const real_t* const lb,		/**< Vector of lower bounds*/
							 | 
						||
| 
								 | 
							
																			const real_t* const ub,		/**< Vector of upper bounds*/
							 | 
						||
| 
								 | 
							
																			const real_t* const lbA,	/**< Vector of lower constraints*/
							 | 
						||
| 
								 | 
							
																			const real_t* const ubA		/**< Vector of upper constraints*/
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Drops the blocking bound/constraint that led to infeasibility, or finds another
							 | 
						||
| 
								 | 
							
								 *  bound/constraint to drop according to drop priorities.
							 | 
						||
| 
								 | 
							
								 *  \return SUCCESSFUL_RETURN \n
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_dropInfeasibles ( 	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																		int BC_number,				/**< Number of the bound or constraint to be added */
							 | 
						||
| 
								 | 
							
																		SubjectToStatus BC_status, 	/**< New status of the bound or constraint to be added */
							 | 
						||
| 
								 | 
							
																		BooleanType BC_isBound,		/**< Whether a bound or a constraint is to be added */
							 | 
						||
| 
								 | 
							
																		real_t *xiB,
							 | 
						||
| 
								 | 
							
																		real_t *xiC
							 | 
						||
| 
								 | 
							
																		);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** 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 QProblem_determineHessianType( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** 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 QProblemBCPY_computeCholesky( QProblem* _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 QProblemBCPY_obtainAuxiliaryWorkingSet(	QProblem* _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
							 | 
						||
| 
								 | 
							
																													 *	 Output: Working set for auxiliary QP. */
							 | 
						||
| 
								 | 
							
																					);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** 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 QProblem_backsolveR(	QProblem* _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 QProblem_backsolveRrem(	QProblem* _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 QProblemBCPY_determineDataShift(	QProblem* _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 QProblemBCPY_setupQPdataM(	QProblem* _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 QProblemBCPY_setupQPdata(	QProblem* _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 QProblemBCPY_setupQPdataFromFile(	QProblem* _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 QProblemBCPY_loadQPvectorsFromFile(	QProblem* _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 QProblem_setInfeasibilityFlag(	QProblem* _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 QProblem_isCPUtimeLimitExceeded(	QProblem* _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 QProblem_regulariseHessian( QProblem* _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Sets Hessian matrix of the QP.
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setHM(	QProblem* _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 QProblem_setH(	QProblem* _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 QProblem_setG(	QProblem* _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_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setLB(	QProblem* _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_INDEX_OUT_OF_BOUNDS */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setLBn(	QProblem* _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_INVALID_ARGUMENTS */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setUB(	QProblem* _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_INDEX_OUT_OF_BOUNDS */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setUBn(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																			int number,		/**< Number of entry to be changed. */
							 | 
						||
| 
								 | 
							
																			real_t value	/**< New value for entry of upper bound vector. */
							 | 
						||
| 
								 | 
							
																			);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Compute relative length of homotopy in data space for termination
							 | 
						||
| 
								 | 
							
								 *  criterion.
							 | 
						||
| 
								 | 
							
								 *  \return Relative length in data space. */
							 | 
						||
| 
								 | 
							
								real_t QProblemBCPY_getRelativeHomotopyLength(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Performs robustified ratio test yield the maximum possible step length
							 | 
						||
| 
								 | 
							
								 *  along the homotopy path.
							 | 
						||
| 
								 | 
							
								 *	\return  SUCCESSFUL_RETURN */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_performRatioTestB(	QProblem* _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 QProblem_isBlocking(	QProblem* _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. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** ...
							 | 
						||
| 
								 | 
							
								 *	\return SUCCESSFUL_RETURN  \n
							 | 
						||
| 
								 | 
							
											RET_UNABLE_TO_OPEN_FILE */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_writeQpDataIntoMatFile(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																				const char* const filename	/**< Mat file name. */
							 | 
						||
| 
								 | 
							
																				);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** ...
							 | 
						||
| 
								 | 
							
								*	\return SUCCESSFUL_RETURN  \n
							 | 
						||
| 
								 | 
							
											RET_UNABLE_TO_OPEN_FILE */
							 | 
						||
| 
								 | 
							
								returnValue QProblem_writeQpWorkspaceIntoMatFile(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																					const char* const filename	/**< Mat file name. */
							 | 
						||
| 
								 | 
							
																					);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t B o u n d s
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_getBounds( QProblem* _THIS, Bounds* _bounds )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int nV = QProblem_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 QProblem_getNV( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return Bounds_getNV( _THIS->bounds );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t N F R
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNFR( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return Bounds_getNFR( _THIS->bounds );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t N F X
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNFX( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return Bounds_getNFX( _THIS->bounds );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t N F V
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNFV( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return Bounds_getNFV( _THIS->bounds );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t S t a t u s
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline QProblemStatus QProblem_getStatus( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return _THIS->status;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	i s I n i t i a l i s e d
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline BooleanType QProblem_isInitialised( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if ( _THIS->status == QPS_NOTINITIALISED )
							 | 
						||
| 
								 | 
							
										return BT_FALSE;
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										return BT_TRUE;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	i s S o l v e d
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline BooleanType QProblem_isSolved( QProblem* _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 QProblem_isInfeasible( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return _THIS->infeasible;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	i s U n b o u n d e d
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline BooleanType QProblem_isUnbounded( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return _THIS->unbounded;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t H e s s i a n T y p e
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline HessianType QProblem_getHessianType( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return _THIS->hessianType;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t H e s s i a n T y p e
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setHessianType( QProblem* _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 QProblem_usingRegularisation( QProblem* _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 QProblem_getOptions( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return _THIS->options;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t O p t i o n s
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setOptions(	QProblem* _THIS,
							 | 
						||
| 
								 | 
							
																				Options _options
							 | 
						||
| 
								 | 
							
																				)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									OptionsCPY( &_options,&(_THIS->options) );
							 | 
						||
| 
								 | 
							
									Options_ensureConsistency( &(_THIS->options) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									QProblem_setPrintLevel( _THIS,_THIS->options.printLevel );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return SUCCESSFUL_RETURN;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t P r i n t L e v e l
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline PrintLevel QProblem_getPrintLevel( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return _THIS->options.printLevel;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t C o u n t
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline unsigned int QProblem_getCount( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return _THIS->count;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	r e s e t C o u n t e r
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_resetCounter( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									_THIS->count = 0;
							 | 
						||
| 
								 | 
							
									return SUCCESSFUL_RETURN;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*****************************************************************************
							 | 
						||
| 
								 | 
							
								 *  P R O T E C T E D                                                        *
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t H
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setHM( QProblem* _THIS, DenseMatrix* H_new )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if ( H_new == 0 )
							 | 
						||
| 
								 | 
							
										return QProblem_setH( _THIS,(real_t*)0 );
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										return QProblem_setH( _THIS,DenseMatrix_getVal(H_new) );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t H
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setH( QProblem* _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,QProblem_getNV( _THIS ),QProblem_getNV( _THIS ),QProblem_getNV( _THIS ),H_new );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return SUCCESSFUL_RETURN;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t G
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setG( QProblem* _THIS, const real_t* const g_new )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									unsigned int nV = (unsigned int)QProblem_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 QProblem_setLB( QProblem* _THIS, const real_t* const lb_new )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									unsigned int i;
							 | 
						||
| 
								 | 
							
									unsigned int nV = (unsigned int)QProblem_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 QProblem_setLBn( QProblem* _THIS, int number, real_t value )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int nV = QProblem_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 QProblem_setUB( QProblem* _THIS, const real_t* const ub_new )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									unsigned int i;
							 | 
						||
| 
								 | 
							
									unsigned int nV = (unsigned int)QProblem_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 QProblem_setUBn( QProblem* _THIS, int number, real_t value )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int nV = QProblem_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 );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * i s B l o c k i n g
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline BooleanType QProblem_isBlocking(	QProblem* _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;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t C o n s t r a i n t s
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_getConstraints( QProblem* _THIS, Constraints* _constraints )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int nV = QProblem_getNV( _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( nV == 0 )
							 | 
						||
| 
								 | 
							
										return THROWERROR( RET_QPOBJECT_NOT_SETUP );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									ConstraintsCPY( _THIS->constraints,_constraints );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return SUCCESSFUL_RETURN;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t N C
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNC( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return Constraints_getNC( _THIS->constraints );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t N E C
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNEC( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return Constraints_getNEC( _THIS->constraints );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t N A C
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNAC( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return Constraints_getNAC( _THIS->constraints );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	g e t N I A C
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline int QProblem_getNIAC( QProblem* _THIS )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return Constraints_getNIAC( _THIS->constraints );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*****************************************************************************
							 | 
						||
| 
								 | 
							
								 *  P R O T E C T E D                                                        *
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t A
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setAM( QProblem* _THIS, DenseMatrix *A_new )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if ( A_new == 0 )
							 | 
						||
| 
								 | 
							
										return QProblem_setA( _THIS,(real_t*)0 );
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										return QProblem_setA( _THIS,DenseMatrix_getVal(A_new) );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t A
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setA( QProblem* _THIS, real_t* const A_new )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int j;
							 | 
						||
| 
								 | 
							
									int nV = QProblem_getNV( _THIS );
							 | 
						||
| 
								 | 
							
									int nC = QProblem_getNC( _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( nV == 0 )
							 | 
						||
| 
								 | 
							
										return THROWERROR( RET_QPOBJECT_NOT_SETUP );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( A_new == 0 )
							 | 
						||
| 
								 | 
							
										return THROWERROR( RET_INVALID_ARGUMENTS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									DenseMatrixCON( _THIS->A,QProblem_getNC( _THIS ),QProblem_getNV( _THIS ),QProblem_getNV( _THIS ),A_new );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									DenseMatrix_times( _THIS->A,1, 1.0, _THIS->x, nV, 0.0, _THIS->Ax, nC);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for( j=0; j<nC; ++j )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										_THIS->Ax_u[j] = _THIS->ubA[j] - _THIS->Ax[j];
							 | 
						||
| 
								 | 
							
										_THIS->Ax_l[j] = _THIS->Ax[j] - _THIS->lbA[j];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/* (ckirches) disable constraints with empty rows */
							 | 
						||
| 
								 | 
							
										if ( qpOASES_isZero( DenseMatrix_getRowNorm( _THIS->A,j,2 ),QPOASES_ZERO ) == BT_TRUE )
							 | 
						||
| 
								 | 
							
											Constraints_setType( _THIS->constraints,j,ST_DISABLED );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return SUCCESSFUL_RETURN;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t L B A
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setLBA( QProblem* _THIS, const real_t* const lbA_new )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									unsigned int i;
							 | 
						||
| 
								 | 
							
									unsigned int nV = (unsigned int)QProblem_getNV( _THIS );
							 | 
						||
| 
								 | 
							
									unsigned int nC = (unsigned int)QProblem_getNC( _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( nV == 0 )
							 | 
						||
| 
								 | 
							
										return THROWERROR( RET_QPOBJECT_NOT_SETUP );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( lbA_new != 0 )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										memcpy( _THIS->lbA,lbA_new,nC*sizeof(real_t) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										/* if no lower constraints' bounds are specified, set them to -infinity */
							 | 
						||
| 
								 | 
							
										for( i=0; i<nC; ++i )
							 | 
						||
| 
								 | 
							
											_THIS->lbA[i] = -QPOASES_INFTY;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return SUCCESSFUL_RETURN;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t L B A
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setLBAn( QProblem* _THIS, int number, real_t value )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int nV = QProblem_getNV( _THIS );
							 | 
						||
| 
								 | 
							
									int nC = QProblem_getNC( _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( nV == 0 )
							 | 
						||
| 
								 | 
							
										return THROWERROR( RET_QPOBJECT_NOT_SETUP );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( ( number >= 0 ) && ( number < nC ) )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										_THIS->lbA[number] = value;
							 | 
						||
| 
								 | 
							
										return SUCCESSFUL_RETURN;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t U B A
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setUBA( QProblem* _THIS, const real_t* const ubA_new )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									unsigned int i;
							 | 
						||
| 
								 | 
							
									unsigned int nV = (unsigned int)QProblem_getNV( _THIS );
							 | 
						||
| 
								 | 
							
									unsigned int nC = (unsigned int)QProblem_getNC( _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( nV == 0 )
							 | 
						||
| 
								 | 
							
										return THROWERROR( RET_QPOBJECT_NOT_SETUP );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( ubA_new != 0 )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										memcpy( _THIS->ubA,ubA_new,nC*sizeof(real_t) );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										/* if no upper constraints' bounds are specified, set them to infinity */
							 | 
						||
| 
								 | 
							
										for( i=0; i<nC; ++i )
							 | 
						||
| 
								 | 
							
											_THIS->ubA[i] = QPOASES_INFTY;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return SUCCESSFUL_RETURN;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	s e t U B A
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline returnValue QProblem_setUBAn( QProblem* _THIS, int number, real_t value )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int nV = QProblem_getNV( _THIS );
							 | 
						||
| 
								 | 
							
									int nC = QProblem_getNC( _THIS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( nV == 0 )
							 | 
						||
| 
								 | 
							
										return THROWERROR( RET_QPOBJECT_NOT_SETUP );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ( ( number >= 0 ) && ( number < nC ) )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										_THIS->ubA[number] = value;
							 | 
						||
| 
								 | 
							
										return SUCCESSFUL_RETURN;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										return THROWERROR( RET_INDEX_OUT_OF_BOUNDS );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								END_NAMESPACE_QPOASES
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif	/* QPOASES_QPROBLEM_H */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *	end of file
							 | 
						||
| 
								 | 
							
								 */
							 |