00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00033 #include <acado/conic_program/dense_cp.hpp>
00034
00035 using namespace std;
00036
00037 BEGIN_NAMESPACE_ACADO
00038
00039
00040
00041
00042
00043
00044 DenseCP::DenseCP( ){
00045
00046 nS = 0;
00047
00048 B = 0;
00049 lbB = 0;
00050 ubB = 0;
00051
00052 x = 0;
00053 ylb = 0;
00054 yub = 0;
00055
00056 ylbA = 0;
00057 yubA = 0;
00058
00059 ylbB = 0;
00060 yubB = 0;
00061 }
00062
00063
00064 DenseCP::DenseCP( const DenseCP& rhs ){
00065
00066 copy(rhs);
00067 }
00068
00069
00070 DenseCP::~DenseCP( ){
00071
00072 clean();
00073 }
00074
00075
00076 DenseCP& DenseCP::operator=( const DenseCP& rhs ){
00077
00078 if ( this != &rhs ){
00079
00080 clean() ;
00081 copy(rhs);
00082 }
00083 return *this;
00084 }
00085
00086
00087
00088 void DenseCP::copy( const DenseCP& rhs ){
00089
00090 uint run1, run2;
00091
00092 nS = rhs.nS;
00093
00094 H = rhs.H;
00095 g = rhs.g;
00096
00097 lb = rhs.lb;
00098 ub = rhs.ub;
00099
00100 A = rhs.A;
00101 lbA = rhs.lbA;
00102 ubA = rhs.ubA;
00103
00104
00105 if( rhs.B != 0 ){
00106 B = (DMatrix**)calloc(nS,sizeof(DMatrix*));
00107 for( run1 = 0; run1 < nS; run1++ ){
00108 B[run1] = new DMatrix[ getNV() ];
00109 for( run2 = 0; run2 < getNV(); run2++ )
00110 B[run1][run2] = rhs.B[run1][run2];
00111 }
00112 }
00113 else B = 0;
00114
00115
00116 if( rhs.lbB != 0 ){
00117 lbB = (DVector*)calloc(nS,sizeof(DVector));
00118 for( run1 = 0; run1 < nS; run1++ )
00119 lbB[run1] = rhs.lbB[run1];
00120 }
00121 else lbB = 0;
00122
00123 if( rhs.ubB != 0 ){
00124 ubB = (DVector*)calloc(nS,sizeof(DVector));
00125 for( run1 = 0; run1 < nS; run1++ )
00126 ubB[run1] = rhs.ubB[run1];
00127 }
00128 else ubB = 0;
00129
00130
00131 if( rhs.x != 0 ) x = new DVector(*rhs.x);
00132 else x = 0 ;
00133
00134 if( rhs.ylb != 0 ) ylb = new DVector(*rhs.ylb);
00135 else ylb = 0 ;
00136
00137 if( rhs.yub != 0 ) yub = new DVector(*rhs.yub);
00138 else yub = 0 ;
00139
00140 if( rhs.ylbA != 0 ) ylbA = new DVector(*rhs.ylbA);
00141 else ylbA = 0 ;
00142
00143 if( rhs.yubA != 0 ) yubA = new DVector(*rhs.yubA);
00144 else yubA = 0 ;
00145
00146 if( nS > 0 ){
00147
00148 ylbB = (DVector**)calloc(nS,sizeof(DVector*));
00149 yubB = (DVector**)calloc(nS,sizeof(DVector*));
00150
00151 for( run1 = 0; run1 < nS; run1++ ){
00152 if( rhs.ylbB[run1] != 0 ) ylbB[run1] = new DVector(*rhs.ylbB[run1]);
00153 else ylbB[run1] = 0 ;
00154
00155 if( rhs.yubB[run1] != 0 ) yubB[run1] = new DVector(*rhs.yubB[run1]);
00156 else yubB[run1] = 0 ;
00157 }
00158 }
00159 else{
00160 ylbB = 0;
00161 yubB = 0;
00162 }
00163 }
00164
00165
00166
00167 void DenseCP::clean(){
00168
00169 uint run1;
00170
00171 for( run1 = 0; run1 < nS; run1++ ){
00172
00173 if( B[run1] != 0 ) delete[] B[run1];
00174 if( ylbB[run1] != 0 ) delete ylbB[run1];
00175 if( yubB[run1] != 0 ) delete yubB[run1];
00176 }
00177
00178 if( B != 0 ) free(B) ;
00179 if( ylbB != 0 ) free(ylbB);
00180 if( yubB != 0 ) free(yubB);
00181
00182 if( lbB != 0 ) free(lbB);
00183 if( ubB != 0 ) free(ubB);
00184
00185 if( ylbA != 0 ) delete ylbA;
00186 if( yubA != 0 ) delete yubA;
00187
00188 if( ylb != 0 ) delete ylb;
00189 if( yub != 0 ) delete yub;
00190
00191 if( x != 0 ) delete x;
00192 }
00193
00194
00195 returnValue DenseCP::init( uint nV_, uint nC_ ){
00196
00197 H.init(nV_,nV_);
00198 A.init(nC_,nV_);
00199
00200 return SUCCESSFUL_RETURN;
00201 }
00202
00203
00204 returnValue DenseCP::setQPsolution( const DVector &x_, const DVector &y_ ){
00205
00206 uint run1;
00207 clean();
00208
00209 ASSERT( x_.getDim() == getNV() );
00210 ASSERT( y_.getDim() == getNV() + getNC() );
00211
00212
00213
00214
00215 x = new DVector(x_);
00216
00217
00218
00219
00220 ylb = new DVector( getNV() );
00221 yub = new DVector( getNV() );
00222
00223 for( run1 = 0; run1 < getNV(); run1++ ){
00224 if( fabs(x_(run1)-lb(run1)) <= BOUNDTOL ){
00225 ylb->operator()(run1) = y_(run1);
00226 yub->operator()(run1) = 0.0 ;
00227 }
00228 else{
00229 ylb->operator()(run1) = 0.0 ;
00230 yub->operator()(run1) = y_(run1);
00231 }
00232 }
00233
00234
00235
00236
00237 DVector tmp = A*x_;
00238 ylbA = new DVector( getNC() );
00239 yubA = new DVector( getNC() );
00240
00241 for( run1 = 0; run1 < getNC(); run1++ ){
00242 if( fabs(tmp(run1)-lbA(run1)) <= BOUNDTOL ){
00243 ylbA->operator()(run1) = y_(getNV()+run1);
00244 yubA->operator()(run1) = 0.0 ;
00245 }
00246 else{
00247 ylbA->operator()(run1) = 0.0 ;
00248 yubA->operator()(run1) = y_(getNV()+run1);
00249 }
00250 }
00251
00252
00253 return SUCCESSFUL_RETURN;
00254 }
00255
00256
00257 DVector DenseCP::getMergedDualSolution( ) const
00258 {
00259 DVector dualSolution( getNV()+getNC() );
00260
00261 uint i;
00262 for( i=0; i<getNV(); ++i )
00263 {
00264 if ( acadoIsGreater( fabs( (*ylb)(i) ),1e-10 ) == BT_TRUE )
00265 dualSolution(i) = (*ylb)(i);
00266 else
00267 dualSolution(i) = (*yub)(i);
00268 }
00269
00270 for( i=0; i<getNC(); ++i )
00271 {
00272 if ( acadoIsGreater( fabs( (*ylbA)(i) ),1e-10 ) == BT_TRUE )
00273 dualSolution( getNV()+i ) = (*ylbA)(i);
00274 else
00275 dualSolution( getNV()+i ) = (*yubA)(i);
00276 }
00277
00278 return dualSolution;
00279 }
00280
00281
00282
00283 returnValue DenseCP::print( const char* const name,
00284 const char* const startString,
00285 const char* const endString,
00286 uint width,
00287 uint precision,
00288 const char* const colSeparator,
00289 const char* const rowSeparator
00290 ) const
00291 {
00292 H.print (cout, "H", startString,endString,width,precision,colSeparator,rowSeparator );
00293 g.print (cout, "g", startString,endString,width,precision,colSeparator,rowSeparator );
00294 lb.print (cout, "lb", startString,endString,width,precision,colSeparator,rowSeparator );
00295 ub.print (cout, "ub", startString,endString,width,precision,colSeparator,rowSeparator );
00296 A.print (cout, "A", startString,endString,width,precision,colSeparator,rowSeparator );
00297 lbA.print(cout, "lbA",startString,endString,width,precision,colSeparator,rowSeparator );
00298 ubA.print(cout, "ubA",startString,endString,width,precision,colSeparator,rowSeparator );
00299
00300 return SUCCESSFUL_RETURN;
00301 }
00302
00303
00304 returnValue DenseCP::print( const char* const name,
00305 PrintScheme printScheme
00306 ) const
00307 {
00308 H.print (cout, "H", printScheme );
00309 g.print (cout, "g", printScheme );
00310 lb.print (cout, "lb", printScheme );
00311 ub.print (cout, "ub", printScheme );
00312 A.print (cout, "A", printScheme );
00313 lbA.print(cout, "lbA",printScheme );
00314 ubA.print(cout, "ubA",printScheme );
00315
00316 return SUCCESSFUL_RETURN;
00317 }
00318
00319
00320 returnValue DenseCP::printToFile( const char* const filename,
00321 const char* const name,
00322 const char* const startString,
00323 const char* const endString,
00324 uint width,
00325 uint precision,
00326 const char* const colSeparator,
00327 const char* const rowSeparator
00328 ) const
00329 {
00330 H.print ( filename,"H", startString,endString,width,precision,colSeparator,rowSeparator );
00331 g.print ( filename,"g", startString,endString,width,precision,colSeparator,rowSeparator );
00332 lb.print ( filename,"lb", startString,endString,width,precision,colSeparator,rowSeparator );
00333 ub.print ( filename,"ub", startString,endString,width,precision,colSeparator,rowSeparator );
00334 A.print ( filename,"A", startString,endString,width,precision,colSeparator,rowSeparator );
00335 lbA.print( filename,"lbA",startString,endString,width,precision,colSeparator,rowSeparator );
00336 ubA.print( filename,"ubA",startString,endString,width,precision,colSeparator,rowSeparator );
00337
00338 return SUCCESSFUL_RETURN;
00339 }
00340
00341
00342 returnValue DenseCP::printToFile( std::ostream& stream,
00343 const char* const name,
00344 const char* const startString,
00345 const char* const endString,
00346 uint width,
00347 uint precision,
00348 const char* const colSeparator,
00349 const char* const rowSeparator
00350 ) const
00351 {
00352 H.print ( stream,"H", startString,endString,width,precision,colSeparator,rowSeparator );
00353 g.print ( stream,"g", startString,endString,width,precision,colSeparator,rowSeparator );
00354 lb.print ( stream,"lb", startString,endString,width,precision,colSeparator,rowSeparator );
00355 ub.print ( stream,"ub", startString,endString,width,precision,colSeparator,rowSeparator );
00356 A.print ( stream,"A", startString,endString,width,precision,colSeparator,rowSeparator );
00357 lbA.print( stream,"lbA",startString,endString,width,precision,colSeparator,rowSeparator );
00358 ubA.print( stream,"ubA",startString,endString,width,precision,colSeparator,rowSeparator );
00359
00360 return SUCCESSFUL_RETURN;
00361 }
00362
00363
00364 returnValue DenseCP::printToFile( const char* const filename,
00365 const char* const name,
00366 PrintScheme printScheme
00367 ) const
00368 {
00369 H.print ( filename,"H", printScheme );
00370 g.print ( filename,"g", printScheme );
00371 lb.print ( filename,"lb", printScheme );
00372 ub.print ( filename,"ub", printScheme );
00373 A.print ( filename,"A", printScheme );
00374 lbA.print( filename,"lbA",printScheme );
00375 ubA.print( filename,"ubA",printScheme );
00376
00377 return SUCCESSFUL_RETURN;
00378 }
00379
00380
00381 returnValue DenseCP::printToFile( std::ostream& stream,
00382 const char* const name,
00383 PrintScheme printScheme
00384 ) const
00385 {
00386 H.print ( stream,"H", printScheme );
00387 g.print ( stream,"g", printScheme );
00388 lb.print ( stream,"lb", printScheme );
00389 ub.print ( stream,"ub", printScheme );
00390 A.print ( stream,"A", printScheme );
00391 lbA.print( stream,"lbA",printScheme );
00392 ubA.print( stream,"ubA",printScheme );
00393
00394 return SUCCESSFUL_RETURN;
00395 }
00396
00397
00398
00399 returnValue DenseCP::printSolution( const char* const name,
00400 const char* const startString,
00401 const char* const endString,
00402 uint width,
00403 uint precision,
00404 const char* const colSeparator,
00405 const char* const rowSeparator
00406 ) const
00407 {
00408 if ( x != 0 )
00409 x->print(cout, "x", startString,endString,width,precision,colSeparator,rowSeparator );
00410
00411 if ( ylb != 0 )
00412 ylb->print(cout, "ylb",startString,endString,width,precision,colSeparator,rowSeparator );
00413
00414 if ( yub != 0 )
00415 yub->print(cout, "yub", startString,endString,width,precision,colSeparator,rowSeparator );
00416
00417 if ( ylbA != 0 )
00418 ylbA->print(cout, "ylbA", startString,endString,width,precision,colSeparator,rowSeparator );
00419
00420 if ( yubA != 0 )
00421 yubA->print(cout, "yubA", startString,endString,width,precision,colSeparator,rowSeparator );
00422
00423 return SUCCESSFUL_RETURN;
00424 }
00425
00426
00427 returnValue DenseCP::printSolution( const char* const name,
00428 PrintScheme printScheme
00429 ) const
00430 {
00431 if ( x != 0 )
00432 x->print(cout, "x", printScheme );
00433
00434 if ( ylb != 0 )
00435 ylb->print(cout, "ylb",printScheme );
00436
00437 if ( yub != 0 )
00438 yub->print(cout, "yub", printScheme );
00439
00440 if ( ylbA != 0 )
00441 ylbA->print(cout, "ylbA", printScheme );
00442
00443 if ( yubA != 0 )
00444 yubA->print(cout, "yubA", printScheme );
00445
00446 return SUCCESSFUL_RETURN;
00447 }
00448
00449
00450 returnValue DenseCP::printSolutionToFile( const char* const filename,
00451 const char* const name,
00452 const char* const startString,
00453 const char* const endString,
00454 uint width,
00455 uint precision,
00456 const char* const colSeparator,
00457 const char* const rowSeparator
00458 ) const
00459 {
00460 if ( x != 0 )
00461 x->print( filename, "x", startString,endString,width,precision,colSeparator,rowSeparator );
00462
00463 if ( ylb != 0 )
00464 ylb->print( filename, "ylb",startString,endString,width,precision,colSeparator,rowSeparator );
00465
00466 if ( yub != 0 )
00467 yub->print( filename, "yub", startString,endString,width,precision,colSeparator,rowSeparator );
00468
00469 if ( ylbA != 0 )
00470 ylbA->print( filename, "ylbA", startString,endString,width,precision,colSeparator,rowSeparator );
00471
00472 if ( yubA != 0 )
00473 yubA->print( filename, "yubA", startString,endString,width,precision,colSeparator,rowSeparator );
00474
00475 return SUCCESSFUL_RETURN;
00476 }
00477
00478
00479 returnValue DenseCP::printSolutionToFile( std::ostream& stream,
00480 const char* const name,
00481 const char* const startString,
00482 const char* const endString,
00483 uint width,
00484 uint precision,
00485 const char* const colSeparator,
00486 const char* const rowSeparator
00487 ) const
00488 {
00489 if ( x != 0 )
00490 x->print( stream, "x", startString,endString,width,precision,colSeparator,rowSeparator );
00491
00492 if ( ylb != 0 )
00493 ylb->print( stream, "ylb",startString,endString,width,precision,colSeparator,rowSeparator );
00494
00495 if ( yub != 0 )
00496 yub->print( stream, "yub", startString,endString,width,precision,colSeparator,rowSeparator );
00497
00498 if ( ylbA != 0 )
00499 ylbA->print( stream, "ylbA", startString,endString,width,precision,colSeparator,rowSeparator );
00500
00501 if ( yubA != 0 )
00502 yubA->print( stream, "yubA", startString,endString,width,precision,colSeparator,rowSeparator );
00503
00504 return SUCCESSFUL_RETURN;
00505 }
00506
00507
00508 returnValue DenseCP::printSolutionToFile( const char* const filename,
00509 const char* const name,
00510 PrintScheme printScheme
00511 ) const
00512 {
00513 if ( x != 0 )
00514 x->print( filename, "x", printScheme );
00515
00516 if ( ylb != 0 )
00517 ylb->print( filename, "ylb",printScheme );
00518
00519 if ( yub != 0 )
00520 yub->print( filename, "yub", printScheme );
00521
00522 if ( ylbA != 0 )
00523 ylbA->print( filename, "ylbA", printScheme );
00524
00525 if ( yubA != 0 )
00526 yubA->print( filename, "yubA", printScheme );
00527
00528 return SUCCESSFUL_RETURN;
00529 }
00530
00531
00532 returnValue DenseCP::printSolutionToFile( std::ostream& stream,
00533 const char* const name,
00534 PrintScheme printScheme
00535 ) const
00536 {
00537 if ( x != 0 )
00538 x->print( stream, "x", printScheme );
00539
00540 if ( ylb != 0 )
00541 ylb->print( stream, "ylb",printScheme );
00542
00543 if ( yub != 0 )
00544 yub->print( stream, "yub", printScheme );
00545
00546 if ( ylbA != 0 )
00547 ylbA->print( stream, "ylbA", printScheme );
00548
00549 if ( yubA != 0 )
00550 yubA->print( stream, "yubA", printScheme );
00551
00552 return SUCCESSFUL_RETURN;
00553 }
00554
00555
00556
00557 CLOSE_NAMESPACE_ACADO
00558
00559