00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00037 #include <qpOASES/SQProblem.hpp>
00038 
00039 
00040 BEGIN_NAMESPACE_QPOASES
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 SQProblem::SQProblem( ) : QProblem( )
00052 {
00053 }
00054 
00055 
00056 
00057 
00058 
00059 SQProblem::SQProblem( int _nV, int _nC, HessianType _hessianType ) : QProblem( _nV,_nC,_hessianType )
00060 {
00061 }
00062 
00063 
00064 
00065 
00066 
00067 SQProblem::SQProblem( const SQProblem& rhs ) : QProblem( rhs )
00068 {
00069 }
00070 
00071 
00072 
00073 
00074 
00075 SQProblem::~SQProblem( )
00076 {
00077 }
00078 
00079 
00080 
00081 
00082 
00083 SQProblem& SQProblem::operator=( const SQProblem& rhs )
00084 {
00085         if ( this != &rhs )
00086         {
00087                 QProblem::operator=( rhs );
00088         }
00089 
00090         return *this;
00091 }
00092 
00093 
00094 
00095 
00096 
00097 returnValue SQProblem::hotstart(        const real_t* const H_new, const real_t* const g_new, const real_t* const A_new,
00098                                                                         const real_t* const lb_new, const real_t* const ub_new,
00099                                                                         const real_t* const lbA_new, const real_t* const ubA_new,
00100                                                                         int& nWSR, real_t* const cputime )
00101 {
00102         if ( ( getStatus( ) == QPS_NOTINITIALISED )       ||
00103                  ( getStatus( ) == QPS_PREPARINGAUXILIARYQP ) ||
00104                  ( getStatus( ) == QPS_PERFORMINGHOMOTOPY )   )
00105         {
00106                 return THROWERROR( RET_HOTSTART_FAILED_AS_QP_NOT_INITIALISED );
00107         }
00108 
00109         
00110         real_t starttime = 0.0;
00111     if ( cputime != 0 )
00112         starttime = getCPUtime( );
00113 
00114 
00115         
00116         if ( setupAuxiliaryQP( H_new,A_new ) != SUCCESSFUL_RETURN )
00117                 return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00118 
00119 
00120         
00121 
00122         
00123         if ( cputime != 0 )
00124                 *cputime -= getCPUtime( ) - starttime;
00125 
00126         returnValue returnvalue = QProblem::hotstart( g_new,lb_new,ub_new,lbA_new,ubA_new, nWSR,cputime );
00127 
00128 
00129         
00130         if ( cputime != 0 )
00131                 *cputime = getCPUtime( ) - starttime;
00132 
00133         return returnvalue;
00134 }
00135 
00136 
00137 
00138 
00139 
00140 returnValue SQProblem::hotstart(        const char* const H_file, const char* const g_file, const char* const A_file,
00141                                                                         const char* const lb_file, const char* const ub_file,
00142                                                                         const char* const lbA_file, const char* const ubA_file,
00143                                                                         int& nWSR, real_t* const cputime
00144                                                                         )
00145 {
00146         int nV = getNV( );
00147         int nC = getNC( );
00148 
00149         returnValue returnvalue;
00150 
00151         
00152         if ( ( H_file == 0 ) || ( g_file == 0 ) )
00153                 return THROWERROR( RET_INVALID_ARGUMENTS );
00154 
00155         if ( ( nC > 0 ) && ( A_file == 0 ) )
00156                 return THROWERROR( RET_INVALID_ARGUMENTS );
00157 
00158 
00159         
00160         real_t* H_new  = new real_t[nV*nV];
00161         real_t* A_new  = new real_t[nC*nV];
00162 
00163         if ( readFromFile( H_new, nV,nV, H_file ) != SUCCESSFUL_RETURN )
00164                 return THROWERROR( RET_UNABLE_TO_READ_FILE );
00165 
00166         if ( readFromFile( A_new, nC,nV, A_file ) != SUCCESSFUL_RETURN )
00167                 return THROWERROR( RET_UNABLE_TO_READ_FILE );
00168 
00169         
00170         real_t* g_new  = new real_t[nV];
00171         real_t* lb_new = 0;
00172         real_t* ub_new = 0;
00173         real_t* lbA_new = 0;
00174         real_t* ubA_new = 0;
00175 
00176         if ( lb_file != 0 )
00177                 lb_new = new real_t[nV];
00178         if ( ub_file != 0 )
00179                 ub_new = new real_t[nV];
00180         if ( lbA_file != 0 )
00181                 lbA_new = new real_t[nC];
00182         if ( ubA_file != 0 )
00183                 ubA_new = new real_t[nC];
00184 
00185         returnvalue = loadQPvectorsFromFile(    g_file,lb_file,ub_file,lbA_file,ubA_file,
00186                                                                                         g_new,lb_new,ub_new,lbA_new,ubA_new
00187                                                                                         );
00188         if ( returnvalue != SUCCESSFUL_RETURN )
00189         {
00190                 if ( ubA_file != 0 )
00191                         delete[] ubA_new;
00192                 if ( lbA_file != 0 )
00193                         delete[] lbA_new;
00194                 if ( ub_file != 0 )
00195                         delete[] ub_new;
00196                 if ( lb_file != 0 )
00197                         delete[] lb_new;
00198                 delete[] g_new;
00199                 delete[] A_new;
00200                 delete[] H_new;
00201 
00202                 return THROWERROR( RET_UNABLE_TO_READ_FILE );
00203         }
00204 
00205         
00206         returnvalue = hotstart( H_new,g_new,A_new,lb_new,ub_new,lbA_new,ubA_new, nWSR,cputime );
00207 
00208         if ( ubA_file != 0 )
00209                 delete[] ubA_new;
00210         if ( lbA_file != 0 )
00211                 delete[] lbA_new;
00212         if ( ub_file != 0 )
00213                 delete[] ub_new;
00214         if ( lb_file != 0 )
00215                 delete[] lb_new;
00216         delete[] g_new;
00217         delete[] A_new;
00218         delete[] H_new;
00219 
00220         return returnvalue;
00221 }
00222 
00223 
00224 
00225 
00226 returnValue SQProblem::hotstart(        SymmetricMatrix *H_new, 
00227                                                                         const real_t* const g_new,
00228                                                                         Matrix *A_new,  
00229                                                                         const real_t* const lb_new,
00230                                                                         const real_t* const ub_new,
00231                                                                         const real_t* const lbA_new,
00232                                                                         const real_t* const ubA_new,
00233                                                                         int& nWSR,                                      
00234                                                                         real_t* const cputime           
00235                                                                         )
00236 {
00237         if ( ( getStatus( ) == QPS_NOTINITIALISED )       ||
00238                  ( getStatus( ) == QPS_PREPARINGAUXILIARYQP ) ||
00239                  ( getStatus( ) == QPS_PERFORMINGHOMOTOPY )   )
00240         {
00241                 return THROWERROR( RET_HOTSTART_FAILED_AS_QP_NOT_INITIALISED );
00242         }
00243 
00244         
00245         real_t starttime = 0.0;
00246     if ( cputime != 0 )
00247         starttime = getCPUtime( );
00248 
00249 
00250         
00251         if ( setupAuxiliaryQP( H_new,A_new ) != SUCCESSFUL_RETURN )
00252                 return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00253 
00254 
00255         
00256 
00257         
00258         if ( cputime != 0 )
00259                 *cputime -= getCPUtime( ) - starttime;
00260 
00261         returnValue returnvalue = QProblem::hotstart( g_new,lb_new,ub_new,lbA_new,ubA_new, nWSR,cputime );
00262 
00263 
00264         
00265         if ( cputime != 0 )
00266                 *cputime = getCPUtime( ) - starttime;
00267 
00268         return returnvalue;     
00269 }
00270 
00271 
00272 
00273 
00274 
00275 returnValue SQProblem::hotstart(        const real_t* const g_new,
00276                                                                         const real_t* const lb_new, const real_t* const ub_new,
00277                                                                         const real_t* const lbA_new, const real_t* const ubA_new,
00278                                                                         int& nWSR, real_t* const cputime
00279                                                                         )
00280 {
00281         
00282         return QProblem::hotstart( g_new,lb_new,ub_new,lbA_new,ubA_new, nWSR,cputime );
00283 }
00284 
00285 
00286 
00287 
00288 
00289 returnValue SQProblem::hotstart(        const char* const g_file,
00290                                                                         const char* const lb_file, const char* const ub_file,
00291                                                                         const char* const lbA_file, const char* const ubA_file,
00292                                                                         int& nWSR, real_t* const cputime
00293                                                                         )
00294 {
00295         
00296         return QProblem::hotstart( g_file,lb_file,ub_file,lbA_file,ubA_file, nWSR,cputime );
00297 }
00298 
00299 
00300 
00301 
00302 
00303 returnValue SQProblem::hotstart(        const real_t* const g_new,
00304                                                                         const real_t* const lb_new, const real_t* const ub_new,
00305                                                                         const real_t* const lbA_new, const real_t* const ubA_new,
00306                                                                         int& nWSR, real_t* const cputime,
00307                                                                         const Bounds* const guessedBounds, const Constraints* const guessedConstraints
00308                                                                         )
00309 {
00310         
00311         return QProblem::hotstart( g_new,lb_new,ub_new,lbA_new,ubA_new, nWSR,cputime, guessedBounds,guessedConstraints );
00312 }
00313 
00314 
00315 
00316 
00317 
00318 returnValue SQProblem::hotstart(        const char* const g_file,
00319                                                                         const char* const lb_file, const char* const ub_file,
00320                                                                         const char* const lbA_file, const char* const ubA_file,
00321                                                                         int& nWSR, real_t* const cputime,
00322                                                                         const Bounds* const guessedBounds, const Constraints* const guessedConstraints
00323                                                                         )
00324 {
00325         
00326         return QProblem::hotstart( g_file,lb_file,ub_file,lbA_file,ubA_file, nWSR,cputime, guessedBounds,guessedConstraints );
00327 }
00328 
00329 
00330 
00331 #ifdef __MATLAB__
00332 returnValue SQProblem::resetMatrixPointers( )
00333 {
00334         H = 0;
00335         A = 0;
00336         
00337         return SUCCESSFUL_RETURN;
00338 }
00339 #endif
00340 
00341 
00342 
00343 
00344 
00345 
00346 
00347 
00348 
00349 
00350 returnValue SQProblem::setupAuxiliaryQP( const real_t* const H_new, const real_t* const A_new )
00351 {
00352         int nV = getNV( );
00353         int nC = getNC( );
00354 
00355         DenseMatrix *dA = new DenseMatrix(nC, nV, nV, (real_t*) A_new);
00356         SymDenseMat *sH = new SymDenseMat(nV, nV, nV, (real_t*) H_new);
00357 
00358         returnValue returnvalue = setupAuxiliaryQP ( sH, dA );
00359 
00360         if ( H_new != 0 )
00361                 freeHessian = BT_TRUE;
00362         freeConstraintMatrix = BT_TRUE;
00363 
00364         return returnvalue;
00365 }
00366 
00367 
00368 
00369 
00370 
00371 returnValue SQProblem::setupAuxiliaryQP ( SymmetricMatrix *H_new, Matrix *A_new )
00372 {
00373 
00374         int i;
00375         int nV = getNV( );
00376         int nC = getNC( );
00377         returnValue returnvalue;
00378 
00379         if ( ( getStatus( ) == QPS_NOTINITIALISED )       ||
00380                  ( getStatus( ) == QPS_PREPARINGAUXILIARYQP ) ||
00381                  ( getStatus( ) == QPS_PERFORMINGHOMOTOPY )   )
00382         {
00383                 return THROWERROR( RET_UPDATEMATRICES_FAILED_AS_QP_NOT_SOLVED );
00384         }
00385 
00386         status = QPS_PREPARINGAUXILIARYQP;
00387 
00388 
00389         
00390         
00391 
00392         
00393         if ( nC > 0 )
00394         {
00395                 if ( A_new == 0 )
00396                         return THROWERROR( RET_INVALID_ARGUMENTS );
00397 
00398                 for ( i=0; i<nC; ++i )
00399                 {
00400                         lbA[i] = -Ax_l[i];
00401                         ubA[i] =  Ax_u[i];
00402                 }
00403 
00404                 
00405                 setA( A_new );
00406 
00407                 
00408                 for ( i=0; i<nC; ++i )
00409                 {
00410                         lbA[i] += Ax[i];
00411                         ubA[i] += Ax[i];
00412                 }
00413 
00414                 
00415                 for ( i=0; i<nC; ++i )
00416                 {
00417                         Ax_u[i] = ubA[i] - Ax[i];
00418                         Ax_l[i] = Ax[i] - lbA[i];
00419                 }
00420         }
00421 
00422         
00423 
00424         
00425         if ( H_new != 0 )
00426         {
00427                 setH( H_new );
00428 
00429                 hessianType = HST_UNKNOWN;
00430                 if ( determineHessianType( ) != SUCCESSFUL_RETURN )
00431                         return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00432 
00433                 
00434                 if ( ( hessianType == HST_ZERO ) ||
00435                          ( hessianType == HST_SEMIDEF ) ||
00436                          ( usingRegularisation( ) == BT_TRUE ) )
00437                 {
00438                         isRegularised = BT_FALSE; 
00439 
00440                         if ( regulariseHessian( ) != SUCCESSFUL_RETURN )
00441                                 return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00442                 }
00443         }
00444         else
00445         {
00446                 if ( H != 0 )
00447                         return THROWERROR( RET_NO_HESSIAN_SPECIFIED );
00448         }
00449 
00450 
00451 
00452         
00453         if ( setupAuxiliaryQPgradient( ) != SUCCESSFUL_RETURN )
00454                 return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00455 
00456 
00457         
00458         
00459         Bounds      oldBounds      = bounds;
00460         Constraints oldConstraints = constraints;
00461 
00462         
00463         bounds.init( nV );
00464         constraints.init( nC );
00465 
00466         
00467         if ( setupSubjectToType( ) != SUCCESSFUL_RETURN )
00468                 return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00469 
00470         if ( bounds.setupAllFree( ) != SUCCESSFUL_RETURN )
00471                 return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00472 
00473         if ( constraints.setupAllInactive( ) != SUCCESSFUL_RETURN )
00474                 return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00475 
00476         
00477         if ( setupTQfactorisation( ) != SUCCESSFUL_RETURN )
00478                 return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00479 
00480         
00481         if ( setupAuxiliaryWorkingSet( &oldBounds,&oldConstraints,BT_TRUE ) != SUCCESSFUL_RETURN )
00482                 return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00483 
00484         
00485         if ( ( getNAC( ) + getNFX( ) ) == 0 )
00486         {
00487                 
00488                 returnvalue = setupCholeskyDecomposition( );
00489         }
00490         else
00491         {
00492                 
00493                 returnvalue = setupCholeskyDecompositionProjected( );
00494         }
00495         if ( returnvalue != SUCCESSFUL_RETURN )
00496         {
00497                 
00498                 bounds.init(nV);
00499                 if (options.initialStatusBounds == ST_LOWER)
00500                         bounds.setupAllLower();
00501                 else
00502                         bounds.setupAllUpper();
00503                 constraints.init(nC);
00504                 constraints.setupAllInactive();
00505 
00506                 if ( setupTQfactorisation( ) != SUCCESSFUL_RETURN )
00507                         return THROWERROR( RET_SETUP_AUXILIARYQP_FAILED );
00508         }
00509 
00510         status = QPS_AUXILIARYQPSOLVED;
00511 
00512         return SUCCESSFUL_RETURN;
00513 }
00514 
00515 END_NAMESPACE_QPOASES
00516 
00517 
00518 
00519 
00520