returnValue DenseQPsolver::solve( DenseCP *cp ) { ASSERT( cp != 0 ); if( cp->isQP() == BT_FALSE ) return ACADOERROR( RET_QP_SOLVER_CAN_ONLY_SOLVE_QP ); if ( makeBoundsConsistent( cp ) != SUCCESSFUL_RETURN ) return ACADOERROR( RET_QP_HAS_INCONSISTENT_BOUNDS ); int maxNumQPiterations; get( MAX_NUM_QP_ITERATIONS, maxNumQPiterations ); returnValue returnvalue; returnvalue = solve( &cp->H, &cp->A, &cp->g, &cp->lb, &cp->ub, &cp->lbA, &cp->ubA, maxNumQPiterations ); if ( ( returnvalue != SUCCESSFUL_RETURN ) && ( returnvalue != RET_QP_SOLUTION_REACHED_LIMIT ) ) return returnvalue; // GET THE PRIMAL AND DUAL SOLUTION FROM THE QP SOLVER AND // STORE THEM IN THE RIGHT FORMAT: // ------------------------------------------------------- Vector xOpt, yOpt; getPrimalSolution( xOpt ); getDualSolution ( yOpt ); // xOpt.print("xOpt"); // yOpt.print("yOpt"); cp->setQPsolution( xOpt,yOpt ); return returnvalue; }
returnValue DenseQPsolver::solveCP( DenseCP *cp ) { ASSERT( cp != 0 ); if( cp->isQP() == BT_FALSE ) return ACADOERROR( RET_QP_SOLVER_CAN_ONLY_SOLVE_QP ); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // QUICK HACK: SOLVE CALL SHOULD AVOID PASSING THE MAX-ITER ARGUMENT !!! const uint maxIter = 1000; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! returnValue returnvalue; returnvalue = solve( &cp->H, &cp->A, &cp->g, &cp->lb, &cp->ub, &cp->lbA, &cp->ubA, maxIter ); if( returnvalue != SUCCESSFUL_RETURN ) return returnvalue; // GET THE PRIMAL AND DUAL SOLUTION FROM THE QP SOLVER AND // STORE THEM IN THE RIGHT FORMAT: // ------------------------------------------------------- Vector xOpt, yOpt; getPrimalSolution( xOpt ); getDualSolution ( yOpt ); // printf( "DeltaU0 = [ %e, %e ]\n", xOpt(4+0),xOpt(4+1) ); // cp->lb.print("lb"); cp->setQPsolution( xOpt, yOpt ); return SUCCESSFUL_RETURN; }