/home/coin/SVN-release/CoinAll-1.1.0/OS/src/OSCommonInterfaces/OSnLNode.h

Go to the documentation of this file.
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 };//end OSnLNode
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 };//end OSnLNodePlus
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 };//end OSnLNodeSum
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 };//end OSnLNodeMax
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 };//end OSnLNodeMin
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 };//end OSnLNodeMinus
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 };//end OSnLNodeNegate
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 };//end OSnLNodeTimes
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 };//end OSnLNodeDivide
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 };//end OSnLNodePower
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 };//end OSnLNodeProduct
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 };//end OSnLNodeLn
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 };//end OSnLNodeSqrt
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 };//end OSnLNodeSquare
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 };//end OSnLNodeCos
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 };//end OSnLNodeSin
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 };//end OSnLNodeExp
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 };//end OSnLNodeAbs
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 };//end OSnLNodeIf
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 };//end OSnLNodeNumber
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 };//end OSnLNodeE
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 };//end OSnLNodePI
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 };//end OSnLNodeVariable
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 };//end OSnLNodeAllDiff
01390 
01391 /* 
01392 TO DO:
01393 
01394 1.  Allow for a variable node with a child
01395 
01396 2.  When we create the Expression Tree from postfix, do we check if the coefficient of a variable is 1?
01397 */
01398 #endif
01399 
01400 

Generated on Sun Nov 14 14:06:39 2010 for Coin-All by  doxygen 1.4.7