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
00027
00035 #include <acado/code_generation/export_variable.hpp>
00036 #include <acado/code_generation/export_variable_internal.hpp>
00037 #include <acado/code_generation/export_arithmetic_statement.hpp>
00038 #include <acado/symbolic_expression/acado_syntax.hpp>
00039
00040
00041 BEGIN_NAMESPACE_ACADO
00042
00043
00044 static const double undefinedEntry = 1073741824.03125;
00045
00046
00047
00048
00049
00050
00051
00052 ExportVariable::ExportVariable()
00053 {
00054 assignNode(new ExportVariableInternal("var", DMatrixPtr(new DMatrix( ))));
00055 }
00056
00057 ExportVariable::ExportVariable( const std::string& _name,
00058 uint _nRows,
00059 uint _nCols,
00060 ExportType _type,
00061 ExportStruct _dataStruct,
00062 bool _callItByValue,
00063 const std::string& _prefix
00064 )
00065 {
00066 DMatrix m(_nRows, _nCols);
00067 m.setAll( undefinedEntry );
00068
00069 assignNode(new ExportVariableInternal(_name, DMatrixPtr(new DMatrix( m )), _type, _dataStruct, _callItByValue, _prefix));
00070 }
00071
00072
00073 ExportVariable::ExportVariable( const std::string& _name,
00074 const DMatrix& _data,
00075 ExportType _type,
00076 ExportStruct _dataStruct,
00077 bool _callItByValue,
00078 const std::string& _prefix,
00079 bool _isGiven
00080 )
00081 {
00082 assignNode(new ExportVariableInternal(_name,
00083 DMatrixPtr(new DMatrix( _data * (_isGiven == true ? 1.0 : undefinedEntry) )), _type, _dataStruct, _callItByValue, _prefix));
00084 }
00085
00086 ExportVariable::ExportVariable( unsigned _nRows,
00087 unsigned _nCols,
00088 ExportType _type,
00089 ExportStruct _dataStruct,
00090 bool _callItByValue,
00091 const std::string& _prefix
00092 )
00093 {
00094 DMatrix m(_nRows, _nCols);
00095 m.setAll( undefinedEntry );
00096
00097 assignNode(new ExportVariableInternal("var", DMatrixPtr(new DMatrix( m )), _type, _dataStruct, _callItByValue, _prefix));
00098 }
00099
00100 ExportVariable::ExportVariable( const std::string& _name,
00101 const DMatrixPtr& _data,
00102 ExportType _type,
00103 ExportStruct _dataStruct,
00104 bool _callItByValue,
00105 const std::string& _prefix
00106 )
00107 {
00108 assignNode(new ExportVariableInternal(_name, _data, _type, _dataStruct, _callItByValue, _prefix));
00109 }
00110
00111 void ExportVariable::simpleForward(const DMatrix& _value)
00112 {
00113 assignNode(new ExportVariableInternal("var", DMatrixPtr(new DMatrix( _value ))));
00114 }
00115
00116
00117 ExportVariable::ExportVariable( const double _data )
00118 {
00119 assignNode(new ExportVariableInternal("var", DMatrixPtr(new DMatrix( _data ))));
00120 }
00121
00122
00123 ExportVariable::~ExportVariable( )
00124 {}
00125
00126 ExportVariable ExportVariable::clone() const
00127 {
00128 ExportVariable ret;
00129 if( !isNull() )
00130 ret.assignNode( (*this)->clone() );
00131
00132 return ret;
00133 }
00134
00135
00136 ExportVariableInternal* ExportVariable::operator->()
00137 {
00138 return (ExportVariableInternal*)(ExportArgument::operator->());
00139 }
00140
00141
00142 const ExportVariableInternal* ExportVariable::operator->() const
00143 {
00144 return (const ExportVariableInternal*)(ExportArgument::operator->());
00145 }
00146
00147
00148 ExportVariable& ExportVariable::setup( const std::string& _name,
00149 uint _nRows,
00150 uint _nCols,
00151 ExportType _type,
00152 ExportStruct _dataStruct,
00153 bool _callItByValue,
00154 const std::string& _prefix
00155 )
00156 {
00157 DMatrix m(_nRows, _nCols);
00158 m.setAll( undefinedEntry );
00159
00160 assignNode(new ExportVariableInternal(_name, DMatrixPtr(new DMatrix( m )), _type, _dataStruct, _callItByValue, _prefix));
00161
00162 return *this;
00163 }
00164
00165
00166 ExportVariable& ExportVariable::setup( const std::string& _name,
00167 const DMatrix& _data,
00168 ExportType _type,
00169 ExportStruct _dataStruct,
00170 bool _callItByValue,
00171 const std::string& _prefix,
00172 bool _isGiven
00173 )
00174 {
00175 assignNode(new ExportVariableInternal(_name,
00176 DMatrixPtr(new DMatrix(_data * (_isGiven == true ? 1.0 : undefinedEntry))), _type, _dataStruct, _callItByValue, _prefix));
00177
00178 return *this;
00179 }
00180
00181
00182 double ExportVariable::operator()( uint rowIdx,
00183 uint colIdx
00184 ) const
00185 {
00186 return (*this)->getGivenMatrix()(rowIdx, colIdx);
00187 }
00188
00189
00190 double ExportVariable::operator()( uint totalIdx
00191 ) const
00192 {
00193 return (*this)->getGivenMatrix()( totalIdx );
00194 }
00195
00196
00197 bool ExportVariable::isZero( const ExportIndex& rowIdx,
00198 const ExportIndex& colIdx
00199 ) const
00200 {
00201 return (*this)->isZero(rowIdx, colIdx);
00202 }
00203
00204
00205 bool ExportVariable::isOne( const ExportIndex& rowIdx,
00206 const ExportIndex& colIdx
00207 ) const
00208 {
00209 return (*this)->isOne(rowIdx, colIdx);
00210 }
00211
00212
00213 bool ExportVariable::isGiven( const ExportIndex& rowIdx,
00214 const ExportIndex& colIdx
00215 ) const
00216 {
00217 return (*this)->isGiven(rowIdx, colIdx);
00218 }
00219
00220
00221 bool ExportVariable::isGiven( ) const
00222 {
00223 return (*this)->isGiven();
00224 }
00225
00226
00227 const std::string ExportVariable::get( const ExportIndex& rowIdx,
00228 const ExportIndex& colIdx
00229 ) const
00230 {
00231 return (*this)->get(rowIdx, colIdx);
00232 }
00233
00234 uint ExportVariable::getNumRows( ) const
00235 {
00236 return (*this)->getNumRows();
00237 }
00238
00239 uint ExportVariable::getNumCols( ) const
00240 {
00241 return (*this)->getNumCols();
00242 }
00243
00244
00245 uint ExportVariable::getDim( ) const
00246 {
00247 return (*this)->getDim();
00248 }
00249
00250
00251 ExportArithmeticStatement operator+( const ExportVariable& arg1,
00252 const ExportVariable& arg2
00253 )
00254 {
00255
00256
00257
00258 return ExportArithmeticStatement(0, ESO_ASSIGN, arg1, ESO_ADD, arg2);
00259 }
00260
00261
00262 ExportArithmeticStatement operator-( const ExportVariable& arg1,
00263 const ExportVariable& arg2
00264 )
00265 {
00266
00267
00268
00269 return ExportArithmeticStatement(0, ESO_ASSIGN, arg1, ESO_SUBTRACT, arg2);
00270 }
00271
00272
00273 ExportArithmeticStatement operator+=( const ExportVariable& arg1,
00274 const ExportVariable& arg2
00275 )
00276 {
00277
00278
00279
00280 return ExportArithmeticStatement(arg1, ESO_ASSIGN, arg2, ESO_ADD_ASSIGN, 0);
00281 }
00282
00283
00284 ExportArithmeticStatement operator-=( const ExportVariable& arg1,
00285 const ExportVariable& arg2
00286 )
00287 {
00288
00289
00290
00291 return ExportArithmeticStatement(arg1, ESO_ASSIGN, arg2, ESO_SUBTRACT_ASSIGN, 0);
00292 }
00293
00294
00295 ExportArithmeticStatement operator*( const ExportVariable& arg1,
00296 const ExportVariable& arg2
00297 )
00298 {
00299
00300
00301 return ExportArithmeticStatement(0, ESO_ASSIGN, arg1, ESO_MULTIPLY, arg2);
00302 }
00303
00304
00305 ExportArithmeticStatement operator^( const ExportVariable& arg1,
00306 const ExportVariable& arg2
00307 )
00308 {
00309
00310
00311 return ExportArithmeticStatement(0, ESO_ASSIGN, arg1, ESO_MULTIPLY_TRANSPOSE, arg2);
00312 }
00313
00314
00315 ExportArithmeticStatement operator==( const ExportVariable& arg1,
00316 const ExportVariable& arg2
00317 )
00318 {
00319
00320
00321
00322 return ExportArithmeticStatement(arg1, ESO_ASSIGN, arg2, ESO_ASSIGN, 0);
00323 }
00324
00325
00326 ExportArithmeticStatement ExportVariable::operator==( ExportArithmeticStatement arg
00327 ) const
00328 {
00329
00330
00331
00332 return ExportArithmeticStatement(*this, ESO_ASSIGN, arg.rhs1, arg.op1, arg.rhs2, arg.op2, arg.rhs3);
00333 }
00334
00335
00336 ExportArithmeticStatement ExportVariable::operator+( ExportArithmeticStatement arg
00337 ) const
00338 {
00339
00340
00341
00342
00343
00344 return ExportArithmeticStatement( 0,ESO_UNDEFINED,arg.rhs1,arg.op1,arg.rhs2,ESO_ADD,*this );
00345 }
00346
00347
00348 ExportArithmeticStatement ExportVariable::operator-( ExportArithmeticStatement arg
00349 ) const
00350 {
00351
00352
00353
00354
00355
00356 return ExportArithmeticStatement( 0,ESO_UNDEFINED,arg.rhs1,arg.op1,arg.rhs2,ESO_SUBTRACT,*this );
00357 }
00358
00359
00360 ExportArithmeticStatement ExportVariable::operator+=( ExportArithmeticStatement arg
00361 ) const
00362 {
00363
00364
00365
00366
00367
00368
00369
00370
00371 return ExportArithmeticStatement( *this,ESO_ADD_ASSIGN,arg.rhs1,arg.op1,arg.rhs2,arg.op2,arg.rhs3 );
00372 }
00373
00374
00375 ExportArithmeticStatement ExportVariable::operator-=( ExportArithmeticStatement arg
00376 ) const
00377 {
00378
00379
00380
00381
00382
00383
00384
00385
00386 return ExportArithmeticStatement( *this,ESO_SUBTRACT_ASSIGN,arg.rhs1,arg.op1,arg.rhs2,arg.op2,arg.rhs3 );
00387 }
00388
00389
00390 ExportVariable ExportVariable::getTranspose( ) const
00391 {
00392 return (*this)->getTranspose();
00393 }
00394
00395 ExportVariable ExportVariable::getRow( const ExportIndex& idx
00396 ) const
00397 {
00398 return (*this)->getRow( idx );
00399 }
00400
00401
00402 ExportVariable ExportVariable::getCol( const ExportIndex& idx
00403 ) const
00404 {
00405 return (*this)->getCol( idx );
00406 }
00407
00408
00409 ExportVariable ExportVariable::getRows( const ExportIndex& idx1,
00410 const ExportIndex& idx2
00411 ) const
00412 {
00413 return (*this)->getRows(idx1, idx2);
00414 }
00415
00416
00417 ExportVariable ExportVariable::getCols( const ExportIndex& idx1,
00418 const ExportIndex& idx2
00419 ) const
00420 {
00421 return (*this)->getCols(idx1, idx2);
00422 }
00423
00424
00425 ExportVariable ExportVariable::getSubMatrix( const ExportIndex& rowIdx1,
00426 const ExportIndex& rowIdx2,
00427 const ExportIndex& colIdx1,
00428 const ExportIndex& colIdx2
00429 ) const
00430 {
00431 return (*this)->getSubMatrix(rowIdx1, rowIdx2, colIdx1, colIdx2);
00432 }
00433
00434 ExportVariable ExportVariable::getElement( const ExportIndex& rowIdx,
00435 const ExportIndex& colIdx
00436 ) const
00437 {
00438 return (*this)->getSubMatrix(rowIdx, rowIdx + 1, colIdx, colIdx + 1);
00439 }
00440
00441
00442 ExportVariable ExportVariable::makeRowVector( ) const
00443 {
00444 return (*this)->makeRowVector();
00445 }
00446
00447
00448 ExportVariable ExportVariable::makeColVector( ) const
00449 {
00450 return (*this)->makeColVector();
00451 }
00452
00453
00454 bool ExportVariable::isVector( ) const
00455 {
00456 return (*this)->isVector();
00457 }
00458
00459
00460 const DMatrix& ExportVariable::getGivenMatrix( ) const
00461 {
00462 return (*this)->getGivenMatrix();
00463 }
00464
00465
00466 returnValue ExportVariable::print( ) const
00467 {
00468 return (*this)->print();
00469 }
00470
00471 bool ExportVariable::isSubMatrix() const
00472 {
00473 return (*this)->isSubMatrix();
00474 }
00475
00476 bool ExportVariable::isDiagonal() const
00477 {
00478 return (*this)->isDiagonal();
00479 }
00480
00481 CLOSE_NAMESPACE_ACADO
00482
00483