/* * S Q P r o b l e m _ h o t s t a r t */ int_t SQProblem_hotstart( int_t handle, SymmetricMatrix* H, real_t* g, Matrix* A, const real_t* const lb, const real_t* const ub, const real_t* const lbA, const real_t* const ubA, int_t nWSRin, real_t maxCpuTimeIn, Options* options, int_t nOutputs, mxArray* plhs[] ) { int_t nWSRout = nWSRin; real_t maxCpuTimeOut = (maxCpuTimeIn >= 0.0) ? maxCpuTimeIn : INFTY; SQProblem* globalSQP = getQPInstance(handle)->sqp; if ( globalSQP == 0 ) { myMexErrMsgTxt( "ERROR (qpOASES): QP needs to be initialised first!" ); return -1; } int_t nV = globalSQP->getNV(); int_t nC = globalSQP->getNC(); /* 1) Solve QP. */ globalSQP->setOptions( *options ); returnValue returnvalue = globalSQP->hotstart( H,g,A,lb,ub,lbA,ubA, nWSRout,&maxCpuTimeOut ); switch (returnvalue) { case SUCCESSFUL_RETURN: case RET_QP_UNBOUNDED: case RET_QP_INFEASIBLE: break; default: myMexErrMsgTxt( "ERROR (qpOASES): Hotstart failed." ); return -1; } /* 2) Assign lhs arguments. */ obtainOutputs( 0,globalSQP,returnvalue,nWSRout,maxCpuTimeOut, nOutputs,plhs,nV,nC ); return 0; }
/* * S Q P r o b l e m _ i n i t */ int_t SQProblem_init( int_t handle, SymmetricMatrix* H, real_t* g, Matrix* A, const real_t* const lb, const real_t* const ub, const real_t* const lbA, const real_t* const ubA, int_t nWSRin, real_t maxCpuTimeIn, const double* const x0, Options* options, int_t nOutputs, mxArray* plhs[], const double* const guessedBounds, const double* const guessedConstraints, const double* const _R ) { int_t nWSRout = nWSRin; real_t maxCpuTimeOut = (maxCpuTimeIn >= 0.0) ? maxCpuTimeIn : INFTY; /* 1) setup initial QP. */ SQProblem* globalSQP = getQPInstance(handle)->sqp; if ( globalSQP == 0 ) { myMexErrMsgTxt( "ERROR (qpOASES): Invalid handle to QP instance!" ); return -1; } globalSQP->setOptions( *options ); /* 2) Solve initial QP. */ returnValue returnvalue; int_t nV = globalSQP->getNV(); int_t nC = globalSQP->getNC(); /* 3) Fill the working set. */ Bounds bounds(nV); Constraints constraints(nC); if (guessedBounds != 0) { for (int_t i = 0; i < nV; i++) { if ( isEqual(guessedBounds[i],-1.0) == BT_TRUE ) { bounds.setupBound(i, ST_LOWER); } else if ( isEqual(guessedBounds[i],1.0) == BT_TRUE ) { bounds.setupBound(i, ST_UPPER); } else if ( isEqual(guessedBounds[i],0.0) == BT_TRUE ) { bounds.setupBound(i, ST_INACTIVE); } else { char msg[MAX_STRING_LENGTH]; snprintf(msg, MAX_STRING_LENGTH, "ERROR (qpOASES): Only {-1, 0, 1} allowed for status of bounds!"); myMexErrMsgTxt(msg); return -1; } } } if (guessedConstraints != 0) { for (int_t i = 0; i < nC; i++) { if ( isEqual(guessedConstraints[i],-1.0) == BT_TRUE ) { constraints.setupConstraint(i, ST_LOWER); } else if ( isEqual(guessedConstraints[i],1.0) == BT_TRUE ) { constraints.setupConstraint(i, ST_UPPER); } else if ( isEqual(guessedConstraints[i],0.0) == BT_TRUE ) { constraints.setupConstraint(i, ST_INACTIVE); } else { char msg[MAX_STRING_LENGTH]; snprintf(msg, MAX_STRING_LENGTH, "ERROR (qpOASES): Only {-1, 0, 1} allowed for status of constraints!"); myMexErrMsgTxt(msg); return -1; } } } returnvalue = globalSQP->init( H,g,A,lb,ub,lbA,ubA, nWSRout,&maxCpuTimeOut, x0,0, (guessedBounds != 0) ? &bounds : 0, (guessedConstraints != 0) ? &constraints : 0, _R ); /* 3) Assign lhs arguments. */ obtainOutputs( 0,globalSQP,returnvalue,nWSRout,maxCpuTimeOut, nOutputs,plhs,nV,nC,handle ); return 0; }