open source driving agent
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.
 
 
 
 
 
 

628 lines
26 KiB

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