00001
00017 #ifndef OSNLNODE_H
00018 #define OSNLNODE_H
00019 #include<iostream>
00020 #include<vector>
00021 #include <map>
00022 #include<cppad/cppad.hpp>
00023
00028 enum OP_CODES{
00029 OS_PLUS = 1001,
00030 OS_SUM = 1002,
00031 OS_MINUS = 1003,
00032 OS_NEGATE = 1004,
00033 OS_TIMES = 1005,
00034 OS_DIVIDE = 1006,
00035 OS_POWER = 1009,
00036 OS_PRODUCT = 1010,
00037 OS_ABS = 2001,
00038 OS_SQUARE = 2005,
00039 OS_SQRT = 2006,
00040 OS_LN = 2007,
00041 OS_EXP = 2010,
00042 OS_SIN = 3001,
00043 OS_COS = 3002,
00044 OS_MIN = 4010,
00045 OS_MAX = 4011,
00046 OS_NUMBER = 5001,
00047 OS_PI = 5003,
00048 OS_E = 5004,
00049 OS_VARIABLE = 6001,
00050 OS_IF = 7001,
00051 OS_ALLDIF = 7016
00052 };
00053
00054 using CppAD::AD;
00055 using CppAD::vector;
00056
00069 class OSnLNode{
00070
00071 public:
00072
00073
00075 std::string snodeName;
00076
00078 int inumberOfChildren;
00079
00081 int inodeInt;
00082
00086 int inodeType;
00087
00091 OSnLNode **m_mChildren;
00092
00096 double m_dFunctionValue;
00097
00098
00102 AD<double> m_CppADTape;
00103
00108 virtual std::string getTokenNumber();
00109
00114 virtual std::string getTokenName();
00115
00125 virtual std::string getNonlinearExpressionInXML();
00126
00137 OSnLNode* createExpressionTreeFromPostfix(std::vector<OSnLNode*> nlNodeVec);
00138
00139
00150 OSnLNode* createExpressionTreeFromPrefix(std::vector<OSnLNode*> nlNodeVec);
00151
00160 std::vector<OSnLNode*> getPrefixFromExpressionTree();
00161
00171 std::vector<OSnLNode*> preOrderOSnLNodeTraversal( std::vector<OSnLNode*> *prefixVector);
00172
00181 std::vector<OSnLNode*> getPostfixFromExpressionTree();
00182
00192 std::vector<OSnLNode*> postOrderOSnLNodeTraversal( std::vector<OSnLNode*> *postfixVector);
00193
00203 virtual void getVariableIndexMap(std::map<int, int> *varIdx);
00204
00205
00216 virtual double calculateFunction(double *x) = 0;
00217
00218
00228 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD) = 0;
00229
00240 virtual OSnLNode *cloneOSnLNode() = 0;
00241
00242
00243
00247 OSnLNode();
00248
00252 virtual ~OSnLNode();
00253
00254 };
00255
00267 class OSnLNodePlus : public OSnLNode{
00268 public:
00272 OSnLNodePlus();
00273
00277 ~OSnLNodePlus();
00278
00283 virtual double calculateFunction( double *x);
00284
00289 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00290
00296 virtual OSnLNode *cloneOSnLNode() ;
00297
00298 };
00299
00311 class OSnLNodeSum : public OSnLNode{
00312 public:
00316 OSnLNodeSum();
00317
00321 ~OSnLNodeSum();
00322
00327 virtual double calculateFunction( double *x);
00328
00333 virtual OSnLNode *cloneOSnLNode() ;
00334
00339 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00340
00341
00342
00343
00344 };
00345
00357 class OSnLNodeMax : public OSnLNode{
00358 public:
00362 OSnLNodeMax();
00363
00367 ~OSnLNodeMax();
00368
00373 virtual double calculateFunction( double *x);
00374
00379 virtual OSnLNode *cloneOSnLNode() ;
00380
00385 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00386
00387
00388
00389 };
00390
00402 class OSnLNodeMin : public OSnLNode{
00403 public:
00407 OSnLNodeMin();
00408
00412 ~OSnLNodeMin();
00413
00418 virtual double calculateFunction( double *x);
00419
00424 virtual OSnLNode *cloneOSnLNode() ;
00425
00430 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00431
00432
00433
00434 };
00435
00436
00448 class OSnLNodeMinus : public OSnLNode{
00449 public:
00453 OSnLNodeMinus();
00454
00458 ~OSnLNodeMinus();
00459
00464 virtual double calculateFunction( double *x);
00465
00470 virtual OSnLNode *cloneOSnLNode() ;
00471
00476 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00477
00478
00479
00480 };
00481
00493 class OSnLNodeNegate : public OSnLNode{
00494 public:
00498 OSnLNodeNegate();
00499
00503 ~OSnLNodeNegate();
00504
00509 virtual double calculateFunction( double *x);
00510
00515 virtual OSnLNode *cloneOSnLNode() ;
00516
00517
00522 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00523
00524
00525 };
00526
00527
00539 class OSnLNodeTimes : public OSnLNode{
00540 public:
00544 OSnLNodeTimes();
00545
00549 ~OSnLNodeTimes();
00550
00555 virtual double calculateFunction( double *x);
00556
00561 virtual OSnLNode *cloneOSnLNode() ;
00562
00567 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00568
00569
00570
00571 };
00572
00573
00585 class OSnLNodeDivide : public OSnLNode{
00586 public:
00590 OSnLNodeDivide();
00591
00595 ~OSnLNodeDivide();
00596
00601 virtual double calculateFunction( double *x);
00602
00607 virtual OSnLNode *cloneOSnLNode() ;
00608
00613 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00614
00615 };
00616
00628 class OSnLNodePower : public OSnLNode{
00629 public:
00633 OSnLNodePower();
00634
00638 ~OSnLNodePower();
00639
00644 virtual double calculateFunction( double *x);
00645
00650 virtual OSnLNode *cloneOSnLNode() ;
00651
00656 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00657
00658
00659
00660 };
00661
00673 class OSnLNodeProduct : public OSnLNode{
00674 public:
00678 OSnLNodeProduct();
00679
00683 ~OSnLNodeProduct();
00684
00689 virtual double calculateFunction( double *x);
00690
00695 virtual OSnLNode *cloneOSnLNode() ;
00696
00701 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00702
00703
00704
00705 };
00706
00707
00719 class OSnLNodeLn : public OSnLNode{
00720 public:
00724 OSnLNodeLn();
00725
00729 ~OSnLNodeLn();
00730
00735 virtual double calculateFunction( double *x);
00736
00741 virtual OSnLNode *cloneOSnLNode() ;
00742
00747 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00748
00749
00750
00751
00752 };
00753
00765 class OSnLNodeSqrt : public OSnLNode{
00766 public:
00770 OSnLNodeSqrt();
00771
00775 ~OSnLNodeSqrt();
00776
00781 virtual double calculateFunction( double *x);
00782
00787 virtual OSnLNode *cloneOSnLNode() ;
00792 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00793
00794
00795
00796
00797 };
00798
00810 class OSnLNodeSquare : public OSnLNode{
00811 public:
00815 OSnLNodeSquare();
00816
00820 ~OSnLNodeSquare();
00821
00826 virtual double calculateFunction( double *x);
00827
00832 virtual OSnLNode *cloneOSnLNode() ;
00833
00838 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00839
00840 };
00841
00853 class OSnLNodeCos : public OSnLNode{
00854 public:
00858 OSnLNodeCos();
00859
00863 ~OSnLNodeCos();
00864
00869 virtual double calculateFunction( double *x);
00870
00875 virtual OSnLNode *cloneOSnLNode() ;
00876
00881 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00882
00883 };
00884
00896 class OSnLNodeSin : public OSnLNode{
00897 public:
00901 OSnLNodeSin();
00902
00906 ~OSnLNodeSin();
00907
00912 virtual double calculateFunction( double *x);
00913
00918 virtual OSnLNode *cloneOSnLNode() ;
00919
00924 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00925
00926 };
00927
00939 class OSnLNodeExp : public OSnLNode{
00940 public:
00944 OSnLNodeExp();
00945
00949 ~OSnLNodeExp();
00950
00955 virtual double calculateFunction( double *x);
00956
00961 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
00962
00968 virtual OSnLNode *cloneOSnLNode() ;
00969
00970 };
00971
00983 class OSnLNodeAbs : public OSnLNode{
00984 public:
00988 OSnLNodeAbs();
00989
00993 ~OSnLNodeAbs();
00994
00999 virtual double calculateFunction( double *x);
01000
01005 virtual OSnLNode *cloneOSnLNode() ;
01006
01011 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
01012
01013
01014
01015 };
01016
01028 class OSnLNodeIf : public OSnLNode{
01029 public:
01033 OSnLNodeIf();
01034
01038 ~OSnLNodeIf();
01039
01044 virtual double calculateFunction( double *x);
01045
01050 virtual OSnLNode *cloneOSnLNode() ;
01051
01056 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
01057
01058
01059
01060 };
01061
01073 class OSnLNodeNumber : public OSnLNode{
01074 public:
01075
01077 double value;
01079 std::string type;
01083 std::string id;
01084
01088 OSnLNodeNumber();
01089
01093 ~OSnLNodeNumber();
01094
01099 virtual std::string getTokenNumber();
01100
01101
01106 virtual std::string getTokenName();
01107
01112 virtual std::string getNonlinearExpressionInXML();
01113
01118 virtual double calculateFunction( double *x);
01119
01124 virtual OSnLNode *cloneOSnLNode() ;
01125
01126
01131 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
01132
01133
01134
01135 };
01136
01137
01149 class OSnLNodeE : public OSnLNode{
01150 public:
01151
01155 OSnLNodeE();
01156
01160 ~OSnLNodeE();
01161
01166 virtual std::string getTokenNumber();
01167
01168
01173 virtual std::string getTokenName();
01174
01179 virtual std::string getNonlinearExpressionInXML();
01180
01185 virtual double calculateFunction( double *x);
01186
01191 virtual OSnLNode *cloneOSnLNode() ;
01192
01193
01198 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
01199
01200
01201
01202 };
01203
01215 class OSnLNodePI : public OSnLNode{
01216 public:
01217
01221 OSnLNodePI();
01222
01226 ~OSnLNodePI();
01227
01232 virtual std::string getTokenNumber();
01233
01234
01239 virtual std::string getTokenName();
01240
01245 virtual std::string getNonlinearExpressionInXML();
01246
01251 virtual double calculateFunction( double *x);
01252
01257 virtual OSnLNode *cloneOSnLNode() ;
01258
01259
01264 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
01265
01266
01267
01268 };
01269
01270
01282 class OSnLNodeVariable : public OSnLNode{
01283 public:
01284
01288 double coef;
01289
01291 int idx;
01292
01296 OSnLNodeVariable();
01297
01301 ~OSnLNodeVariable();
01302
01303 virtual void getVariableIndexMap(std::map<int, int> *varIdx);
01304
01309 virtual std::string getTokenNumber();
01310
01311
01316 virtual std::string getTokenName();
01317
01322 virtual std::string getNonlinearExpressionInXML();
01323
01328 virtual double calculateFunction( double *x);
01329
01334 virtual OSnLNode *cloneOSnLNode() ;
01335
01340 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
01341
01342
01343
01344 };
01345
01357 class OSnLNodeAllDiff : public OSnLNode{
01358 public:
01362 OSnLNodeAllDiff();
01363
01367 ~OSnLNodeAllDiff();
01368
01373 virtual double calculateFunction( double *x);
01374
01379 virtual OSnLNode *cloneOSnLNode() ;
01380
01385 virtual AD<double> constructCppADTape(std::map<int, int> *cppADIdx, CppAD::vector< AD<double> > *XAD);
01386
01387
01388
01389 };
01390
01391
01392
01393
01394
01395
01396
01397
01398 #endif
01399
01400