![]() |
|
|
Generated: 8 Jan 2009 |
00001 // $Id: FunAdapters.h,v 1.2 2005/11/25 10:27:03 mato Exp $ 00002 // ============================================================================ 00003 #ifndef GAUDIMATH_FUNADAPTERS_H 00004 #define GAUDIMATH_FUNADAPTERS_H 1 00005 // ============================================================================ 00006 // Include files 00007 // ============================================================================ 00008 // from CLHEP 00009 // ============================================================================ 00010 #include "CLHEP/GenericFunctions/GenericFunctions.hh" 00011 #include "CLHEP/GenericFunctions/Argument.hh" 00012 #include "CLHEP/GenericFunctions/AbsFunction.hh" 00013 // ============================================================================ 00014 00015 namespace AIDA { class IFunction ; }; 00016 00017 namespace Genfun 00018 { 00019 namespace GaudiMathImplementation 00020 { 00021 // ======================================================================== 00029 // ========================================================================= 00030 00031 class AdapterIFunction : public AbsFunction 00032 { 00033 public: 00035 FUNCTION_OBJECT_DEF( AdapterIFunction ) ; 00036 public: 00040 AdapterIFunction ( const AIDA::IFunction& fun) ; 00042 AdapterIFunction ( const AdapterIFunction& ); 00044 virtual ~AdapterIFunction() ; 00045 00046 virtual double operator() ( double a ) const ; 00047 00048 virtual double operator() ( const Argument& x ) const; 00049 00050 virtual unsigned int dimensionality () const { return m_dim ; } 00051 00053 virtual bool hasAnalyticDerivative() const { return true ; } 00055 virtual Genfun::Derivative partial( unsigned int i ) const ; 00056 00057 private: 00058 AdapterIFunction(); 00059 AdapterIFunction& operator=(const AdapterIFunction&); 00060 private: 00061 const AIDA::IFunction* m_fun ; 00062 size_t m_dim ; 00063 mutable std::vector<double> m_arg ; 00064 }; 00065 00066 // ======================================================================== 00090 // ======================================================================== 00091 class Adapter2DoubleFunction : public AbsFunction 00092 { 00093 public: 00095 typedef double (*Function)( const double , 00096 const double ) ; 00097 public: 00099 FUNCTION_OBJECT_DEF( Adapter2DoubleFunction ) ; 00100 public: 00102 Adapter2DoubleFunction ( Function func ); 00104 Adapter2DoubleFunction ( const Adapter2DoubleFunction& ); 00106 virtual ~Adapter2DoubleFunction () ; 00107 00108 virtual double operator() ( double x ) const ; 00109 00110 virtual double operator() ( const Argument& x ) const ; 00111 00112 virtual unsigned int dimensionality() const { return 2 ; } 00114 virtual bool hasAnalyticDerivative() const { return true ; } 00116 virtual Genfun::Derivative partial( unsigned int i ) const ; 00117 public: 00118 double operator() ( const double x , const double y ) const ; 00119 private: 00120 // default constructor is disabled 00121 Adapter2DoubleFunction(); 00122 // assigmenet operator is disabled 00123 Adapter2DoubleFunction& operator = ( const Adapter2DoubleFunction&); 00124 private: 00125 Function m_func ; 00126 }; 00127 00128 // ======================================================================== 00153 // ======================================================================== 00154 class Adapter3DoubleFunction : public AbsFunction 00155 { 00156 public: 00158 typedef double (*Function)( const double , 00159 const double , 00160 const double ) ; 00161 public: 00163 FUNCTION_OBJECT_DEF( Adapter3DoubleFunction ) ; 00164 public: 00166 Adapter3DoubleFunction ( Function func ); 00168 Adapter3DoubleFunction ( const Adapter3DoubleFunction& ); 00170 virtual ~Adapter3DoubleFunction () ; 00171 00172 virtual double operator() ( double x ) const ; 00173 00174 virtual double operator() ( const Argument& x ) const ; 00175 00176 virtual unsigned int dimensionality() const { return 3 ; } 00178 virtual bool hasAnalyticDerivative() const { return true ; } 00180 virtual Genfun::Derivative partial( unsigned int i ) const ; 00181 public: 00182 double operator() ( const double x , 00183 const double y , 00184 const double z ) const ; 00185 private: 00186 // default constructor is disabled 00187 Adapter3DoubleFunction(); 00188 // assigmenet operator is disabled 00189 Adapter3DoubleFunction& operator = ( const Adapter3DoubleFunction&); 00190 private: 00191 Function m_func ; 00192 }; 00193 00194 // ======================================================================== 00201 // ======================================================================== 00202 class SimpleFunction : public AbsFunction 00203 { 00204 public: 00205 typedef double (*Function1)( const double ) ; 00206 typedef double (*Function2)( const double* ) ; 00207 typedef double (*Function3)( const std::vector<double>& ) ; 00208 protected: 00209 enum Case { TrivialArg , ArrayArg , VectorArg } ; 00210 public: 00212 FUNCTION_OBJECT_DEF( SimpleFunction ) ; 00213 00214 public: 00215 00219 SimpleFunction ( Function1 func ) ; 00220 00225 SimpleFunction ( Function2 func , 00226 const size_t dim ) ; 00227 00232 SimpleFunction ( Function3 func , 00233 const size_t dim ) ; 00234 00236 SimpleFunction ( const SimpleFunction& ) ; 00237 00238 // destructor 00239 virtual ~SimpleFunction(); 00240 public: 00241 00243 virtual unsigned int dimensionality () const { return m_DIM ; } 00245 virtual bool hasAnalyticDerivative () const { return true ; } 00247 virtual double operator() ( double ) const ; 00249 virtual double operator() ( const Argument& ) const ; 00251 virtual Genfun::Derivative partial ( unsigned int i ) const ; 00252 00253 private: 00254 00255 // the default constructor is disabled 00256 SimpleFunction() ; 00257 // the assignement operator is disabled 00258 SimpleFunction& operator=(const SimpleFunction& ); 00259 00260 private: 00261 00262 Case m_case ; 00263 size_t m_DIM ; 00264 00265 Function1 m_func1 ; 00266 00267 Function2 m_func2 ; 00268 double* m_arg2 ; 00269 00270 Function3 m_func3 ; 00271 mutable std::vector<double> m_arg3 ; 00272 }; 00273 00274 }; // end of namespace GaudiMathImeplementation 00275 }; // end of namespace Genfun 00276 00277 00278 #endif // GAUDIMATH_FUNADAPTERS_H 00279 // ============================================================================