00001 #ifndef AFL_FUNCTIONS_H 00002 #define AFL_FUNCTIONS_H 00003 00004 #include "afltypes.h" 00005 00006 #include "basisinterpolator_1.h" 00007 #include "basisinterpolator_2.h" 00008 #include "basisinterpolator_3.h" 00009 #include "basisinterpolator_4.h" 00010 00011 #include "functioniterator.h" 00012 00013 #include <string> 00014 00015 namespace afl 00016 { 00017 class CompositeField; 00021 class Function 00022 { 00023 public: 00027 struct Context 00028 { 00032 Context( ); 00033 00037 size_t row; 00038 00042 size_t column; 00043 }; 00044 00045 virtual ~Function(); 00052 virtual data_t evaluate( const Point& p, Context* ctxt = NULL ) const = 0; 00053 00058 virtual void serialise( std::ostream& doc ) const = 0; 00059 00063 virtual Function* clone( ) const = 0; 00064 00068 typedef FunctionIterator iterator; 00069 00073 iterator begin( ) { return iterator(this); } 00074 00078 iterator end( ) { return iterator(NULL); } 00079 00080 private: 00081 friend class FunctionIterator; 00085 size_t getNumArgs( ) const { return _args.size(); } 00086 00091 Function* getArg( size_t argNum ) { return _args[argNum]; } 00092 00093 protected: 00097 std::vector<Function*> _args; 00098 }; 00099 00103 class FieldFn : public Function 00104 { 00105 public: 00110 FieldFn( const Field* field, Function* arg ); 00111 00117 FieldFn( const Field* field, Function* arg1, Function* arg2 ); 00118 00125 FieldFn( const Field* field, Function* arg1, Function* arg2, Function* arg3 ); 00126 00134 FieldFn( const Field* field, Function* arg1, Function* arg2, Function* arg3, Function* arg4 ); 00135 00142 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00143 00148 virtual void serialise( std::ostream& doc ) const; 00149 00153 virtual Function* clone( ) const; 00154 00155 00156 private: 00157 const Field* _f; 00158 size_t _row; 00159 size_t _col; 00160 }; 00161 00165 class Negate : public Function 00166 { 00167 public: 00171 Negate( Function* arg ); 00172 00179 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00180 00185 virtual void serialise( std::ostream& doc ) const; 00186 00190 virtual Function* clone( ) const; 00191 }; 00192 00196 class Argument : public Function 00197 { 00198 public: 00202 Argument( aspectid_t aspect ); 00203 00210 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00211 00216 virtual void serialise( std::ostream& doc ) const; 00217 00221 virtual Function* clone( ) const; 00222 00223 private: 00224 aspectid_t _aspect; 00225 size_t _axis; 00226 }; 00227 00231 class BasisArgument : public Function 00232 { 00233 public: 00237 BasisArgument( size_t index ); 00238 00245 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const = 0; 00246 00251 virtual void serialise( std::ostream& doc ) const; 00252 00256 virtual Function* clone( ) const = 0; 00257 00258 protected: 00262 size_t _u; 00263 }; 00264 00268 class BasisArgument_1 : public BasisArgument 00269 { 00270 public: 00276 BasisArgument_1( const BasisInterpolator_1* interp, size_t index ); 00277 00284 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00285 00289 virtual Function* clone( ) const; 00290 00291 private: 00292 friend class BasisInterpolator_1; 00293 00294 const BasisInterpolator_1* _interp; 00295 }; 00296 00300 class BasisArgument_2 : public BasisArgument 00301 { 00302 public: 00308 BasisArgument_2( const BasisInterpolator_2* interp, size_t index ); 00309 00316 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00317 00321 virtual Function* clone( ) const; 00322 00323 private: 00324 friend class BasisInterpolator_2; 00325 00326 const BasisInterpolator_2* _interp; 00327 }; 00328 00332 class BasisArgument_3 : public BasisArgument 00333 { 00334 public: 00340 BasisArgument_3( const BasisInterpolator_3* interp, size_t index ); 00341 00348 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00349 00353 virtual Function* clone( ) const; 00354 00355 private: 00356 friend class BasisInterpolator_3; 00357 00358 const BasisInterpolator_3* _interp; 00359 }; 00360 00364 class BasisArgument_4 : public BasisArgument 00365 { 00366 public: 00372 BasisArgument_4( const BasisInterpolator_4* interp, size_t index ); 00373 00380 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00381 00385 virtual Function* clone( ) const; 00386 00387 private: 00388 friend class BasisInterpolator_4; 00389 00390 const BasisInterpolator_4* _interp; 00391 }; 00392 00396 class KsiBasisArgument_1 : public BasisArgument 00397 { 00398 public: 00404 KsiBasisArgument_1( const BasisInterpolator_1* interp, size_t index ); 00405 00412 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00413 00418 virtual void serialise( std::ostream& doc ) const; 00419 00423 virtual Function* clone( ) const; 00424 00425 private: 00426 friend class BasisInterpolator_1; 00427 00428 const BasisInterpolator_1* _interp; 00429 }; 00430 00434 class KsiBasisArgument_2 : public BasisArgument 00435 { 00436 public: 00442 KsiBasisArgument_2( const BasisInterpolator_2* interp, size_t index ); 00443 00450 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00451 00456 virtual void serialise( std::ostream& doc ) const; 00457 00461 virtual Function* clone( ) const; 00462 00463 private: 00464 friend class BasisInterpolator_2; 00465 00466 const BasisInterpolator_2* _interp; 00467 }; 00468 00472 class KsiBasisArgument_3 : public BasisArgument 00473 { 00474 public: 00480 KsiBasisArgument_3( const BasisInterpolator_3* interp, size_t index ); 00481 00488 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00489 00494 virtual void serialise( std::ostream& doc ) const; 00495 00499 virtual Function* clone( ) const; 00500 00501 private: 00502 friend class BasisInterpolator_3; 00503 00504 const BasisInterpolator_3* _interp; 00505 }; 00506 00510 class KsiBasisArgument_4 : public BasisArgument 00511 { 00512 public: 00518 KsiBasisArgument_4( const BasisInterpolator_4* interp, size_t index ); 00519 00526 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00527 00532 virtual void serialise( std::ostream& doc ) const; 00533 00537 virtual Function* clone( ) const; 00538 00539 private: 00540 friend class BasisInterpolator_4; 00541 00542 const BasisInterpolator_4* _interp; 00543 }; 00544 00548 class Constant : public Function 00549 { 00550 public: 00554 Constant( data_t val ); 00555 00562 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00563 00568 virtual void serialise( std::ostream& doc ) const; 00569 00573 virtual Function* clone( ) const; 00574 00575 private: 00576 data_t _val; 00577 }; 00578 00582 class Sum : public Function 00583 { 00584 public: 00589 Sum( Function* arg1, Function* arg2 ); 00590 00597 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00598 00603 virtual void serialise( std::ostream& doc ) const; 00604 00608 virtual Function* clone( ) const; 00609 }; 00610 00614 class Subtract : public Function 00615 { 00616 public: 00621 Subtract( Function* arg1, Function* arg2 ); 00622 00629 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00630 00635 virtual void serialise( std::ostream& doc ) const; 00636 00640 virtual Function* clone( ) const; 00641 }; 00642 00646 class Multiply : public Function 00647 { 00648 public: 00653 Multiply( Function* arg1, Function* arg2 ); 00654 00661 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00662 00667 virtual void serialise( std::ostream& doc ) const; 00668 00672 virtual Function* clone( ) const; 00673 }; 00674 00678 class Divide : public Function 00679 { 00680 public: 00685 Divide( Function* arg1, Function* arg2 ); 00686 00693 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00694 00699 virtual void serialise( std::ostream& doc ) const; 00700 00704 virtual Function* clone( ) const; 00705 }; 00706 00710 class Power : public Function 00711 { 00712 public: 00717 Power( Function* arg1, Function* arg2 ); 00718 00725 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00726 00731 virtual void serialise( std::ostream& doc ) const; 00732 00736 virtual Function* clone( ) const; 00737 }; 00738 00742 class OnTopOf : public Function 00743 { 00744 public: 00749 OnTopOf( Function* arg1, Function* arg2 ); 00750 00757 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00758 00763 virtual void serialise( std::ostream& doc ) const; 00764 00768 virtual Function* clone( ) const; 00769 }; 00770 00774 class Sin : public Function 00775 { 00776 public: 00780 Sin( Function* arg ); 00781 00788 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00789 00794 virtual void serialise( std::ostream& doc ) const; 00795 00799 virtual Function* clone( ) const; 00800 }; 00801 00802 00806 class ArcSin : public Function 00807 { 00808 public: 00812 ArcSin( Function* arg ); 00813 00820 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00821 00826 virtual void serialise( std::ostream& doc ) const; 00827 00831 virtual Function* clone( ) const; 00832 }; 00833 00837 class Cos : public Function 00838 { 00839 public: 00843 Cos( Function* arg ); 00844 00851 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00852 00857 virtual void serialise( std::ostream& doc ) const; 00858 00862 virtual Function* clone( ) const; 00863 }; 00864 00868 class ArcCos : public Function 00869 { 00870 public: 00874 ArcCos( Function* arg ); 00875 00882 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00883 00888 virtual void serialise( std::ostream& doc ) const; 00889 00893 virtual Function* clone( ) const; 00894 }; 00895 00899 class Tan : public Function 00900 { 00901 public: 00905 Tan( Function* arg ); 00906 00913 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00914 00919 virtual void serialise( std::ostream& doc ) const; 00920 00924 virtual Function* clone( ) const; 00925 }; 00926 00930 class ArcTan : public Function 00931 { 00932 public: 00936 ArcTan( Function* arg ); 00937 00944 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00945 00950 virtual void serialise( std::ostream& doc ) const; 00951 00955 virtual Function* clone( ) const; 00956 }; 00957 00961 class Cot : public Function 00962 { 00963 public: 00967 Cot( Function* arg ); 00968 00975 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 00976 00981 virtual void serialise( std::ostream& doc ) const; 00982 00986 virtual Function* clone( ) const; 00987 }; 00988 00992 class Ln : public Function 00993 { 00994 public: 00998 Ln( Function* arg ); 00999 01006 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 01007 01012 virtual void serialise( std::ostream& doc ) const; 01013 01017 virtual Function* clone( ) const; 01018 }; 01019 01023 class Exp : public Function 01024 { 01025 public: 01029 Exp( Function* arg ); 01030 01037 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 01038 01043 virtual void serialise( std::ostream& doc ) const; 01044 01048 virtual Function* clone( ) const; 01049 }; 01050 01051 01055 class Sqrt : public Function 01056 { 01057 public: 01061 Sqrt( Function* arg ); 01062 01069 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 01070 01075 virtual void serialise( std::ostream& doc ) const; 01076 01080 virtual Function* clone( ) const; 01081 }; 01082 01086 class Abs : public Function 01087 { 01088 public: 01092 Abs( Function* arg ); 01093 01100 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 01101 01106 virtual void serialise( std::ostream& doc ) const; 01107 01111 virtual Function* clone( ) const; 01112 }; 01113 01117 class Min : public Function 01118 { 01119 public: 01124 Min( Function* arg1, Function* arg2 ); 01125 01132 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 01133 01138 virtual void serialise( std::ostream& doc ) const; 01139 01143 virtual Function* clone( ) const; 01144 }; 01145 01149 class Max : public Function 01150 { 01151 public: 01156 Max( Function* arg1, Function* arg2 ); 01157 01164 virtual data_t evaluate( const Point& p, Function::Context* ctxt ) const; 01165 01170 virtual void serialise( std::ostream& doc ) const; 01171 01175 virtual Function* clone( ) const; 01176 }; 01177 01184 Function* parseFunction( const std::string& expression ); 01185 01193 Function* parseFunction( const std::string& expression, const CompositeField* cntxt ); 01194 01202 Function* parseFunction( const std::string& expression, const BasisInterpolator_1* cntxt ); 01203 01211 Function* parseFunction( const std::string& expression, const BasisInterpolator_2* cntxt ); 01212 01220 Function* parseFunction( const std::string& expression, const BasisInterpolator_3* cntxt ); 01221 01229 Function* parseFunction( const std::string& expression, const BasisInterpolator_4* cntxt ); 01230 } 01231 01232 #endif