/* * g e t K k t V i o l a t i o n */ returnValue getKktViolation( int_t nV, const real_t* const H, const real_t* const g, const real_t* const lb, const real_t* const ub, const real_t* const x, const real_t* const y, real_t& stat, real_t& feas, real_t& cmpl, const real_t* const workingSetB, BooleanType hasIdentityHessian ) { return getKktViolation( nV,0, H,g,0,lb,ub,0,0, x,y, stat,feas,cmpl, workingSetB,0,hasIdentityHessian ); }
/* * s o l v e O q p B e n c h m a r k */ returnValue solveOqpBenchmark( int_t nQP, int_t nV, const real_t* const _H, const real_t* const g, const real_t* const lb, const real_t* const ub, BooleanType isSparse, BooleanType useHotstarts, const Options& options, int_t maxAllowedNWSR, real_t& maxNWSR, real_t& avgNWSR, real_t& maxCPUtime, real_t& avgCPUtime, real_t& maxStationarity, real_t& maxFeasibility, real_t& maxComplementarity ) { int_t k; /* I) SETUP AUXILIARY VARIABLES: */ /* 1) Keep nWSR and store current and maximum number of * working set recalculations in temporary variables */ int_t nWSRcur; real_t CPUtimeLimit = maxCPUtime; real_t CPUtimeCur = CPUtimeLimit; real_t stat, feas, cmpl; maxNWSR = 0; avgNWSR = 0; maxCPUtime = 0.0; avgCPUtime = 0.0; maxStationarity = 0.0; maxFeasibility = 0.0; maxComplementarity = 0.0; /* 2) Pointers to data of current QP ... */ const real_t* gCur; const real_t* lbCur; const real_t* ubCur; /* 3) Vectors for solution obtained by qpOASES. */ real_t* x = new real_t[nV]; real_t* y = new real_t[nV]; //real_t obj; /* 4) Prepare matrix objects */ SymmetricMatrix *H; real_t* H_cpy = new real_t[nV*nV]; memcpy( H_cpy,_H, ((uint_t)(nV*nV))*sizeof(real_t) ); if ( isSparse == BT_TRUE ) { SymSparseMat *Hs; H = Hs = new SymSparseMat(nV, nV, nV, H_cpy); Hs->createDiagInfo(); delete[] H_cpy; } else { H = new SymDenseMat(nV, nV, nV, const_cast<real_t *>(H_cpy)); } H->doFreeMemory( ); /* II) SETUP QPROBLEM OBJECT */ QProblemB qp( nV ); qp.setOptions( options ); //qp.setPrintLevel( PL_LOW ); /* III) RUN BENCHMARK SEQUENCE: */ returnValue returnvalue; for( k=0; k<nQP; ++k ) { //if ( k%50 == 0 ) // printf( "%d\n",k ); /* 1) Update pointers to current QP data. */ gCur = &( g[k*nV] ); lbCur = &( lb[k*nV] ); ubCur = &( ub[k*nV] ); /* 2) Set nWSR and maximum CPU time. */ nWSRcur = maxAllowedNWSR; CPUtimeCur = CPUtimeLimit; /* 3) Solve current QP. */ if ( ( k == 0 ) || ( useHotstarts == BT_FALSE ) ) { /* initialise */ returnvalue = qp.init( H,gCur,lbCur,ubCur, nWSRcur,&CPUtimeCur ); if ( ( returnvalue != SUCCESSFUL_RETURN ) && ( returnvalue != RET_MAX_NWSR_REACHED ) ) { delete H; delete[] y; delete[] x; return THROWERROR( returnvalue ); } } else { /* hotstart */ returnvalue = qp.hotstart( gCur,lbCur,ubCur, nWSRcur,&CPUtimeCur ); if ( ( returnvalue != SUCCESSFUL_RETURN ) && ( returnvalue != RET_MAX_NWSR_REACHED ) ) { delete H; delete[] y; delete[] x; return THROWERROR( returnvalue ); } } /* 4) Obtain solution vectors and objective function value ... */ qp.getPrimalSolution( x ); qp.getDualSolution( y ); //obj = qp.getObjVal( ); /* 5) Compute KKT residuals */ getKktViolation( nV, _H,gCur,lbCur,ubCur, x,y, stat,feas,cmpl ); /* 6) update maximum values. */ if ( nWSRcur > maxNWSR ) maxNWSR = nWSRcur; if (stat > maxStationarity) maxStationarity = stat; if (feas > maxFeasibility) maxFeasibility = feas; if (cmpl > maxComplementarity) maxComplementarity = cmpl; if ( CPUtimeCur > maxCPUtime ) maxCPUtime = CPUtimeCur; avgNWSR += nWSRcur; avgCPUtime += CPUtimeCur; } avgNWSR /= nQP; avgCPUtime /= ((double)nQP); delete H; delete[] y; delete[] x; return SUCCESSFUL_RETURN; }