00001 #ifndef SYMBOLICFEFUNC_H 00002 #define SYMBOLICFEFUNC_H 00003 00004 #include "SundanceDefs.h" 00005 00006 #include "FuncExprBase.h" 00007 #include "Expr.h" 00008 00009 namespace Sundance 00010 { 00011 00012 using namespace TSF; 00013 using std::string; 00014 00015 using std::ostream; 00016 00017 /** \ingroup LowLevelSymbolics 00018 * Expression subtype representing a unknown or variational function 00019 * with a basis. 00020 */ 00021 00022 class SymbolicFunction : public FuncExprBase 00023 { 00024 public: 00025 /** \name Developer-only methods */ 00026 //@{ 00027 /** */ 00028 SymbolicFunction(const BasisFamily& basis); 00029 /** */ 00030 SymbolicFunction(const BasisFamily& basis, const string& name); 00031 00032 /** */ 00033 virtual const MultiIndex& multiIndex() const {return d_;} 00034 00035 // differentiation 00036 /** */ 00037 virtual void derivative(const MultiIndex& d, Expr& result) const ; 00038 /** */ 00039 virtual void setMultiIndex(const MultiIndex& d) {d_ = d;} 00040 00041 // ordering 00042 /** */ 00043 virtual bool operator==(const Expr& other) const ; 00044 /** */ 00045 virtual bool operator<(const Expr& other) const ; 00046 /** */ 00047 virtual int sortPriority() const {return SYMBOLICFUNCTION;} 00048 00049 // misc 00050 /** */ 00051 virtual ExprBase* clone() const = 0 ; 00052 /** */ 00053 virtual void print(ostream& os, bool paren=false) const ; 00054 /** */ 00055 virtual string toString(bool paren=false) const ; 00056 /** */ 00057 virtual XMLObject toXML() const ; 00058 00059 // FE 00060 /** */ 00061 virtual void getBasis(BasisFamily& basis) const {basis = basis_;} 00062 00063 00064 00065 /** */ 00066 virtual void differential(const Expr& u, const Expr& du, 00067 Expr& result) const ; 00068 00069 /** */ 00070 virtual void substitute(const Expr& u, const Expr& u0, 00071 Expr& result) const ; 00072 //@} 00073 protected: 00074 MultiIndex d_; 00075 BasisFamily basis_; 00076 }; 00077 00078 00079 } 00080 #endif