// Author: Wim Lavrijsen   November 2010

#ifndef ROOT_TPyFitFunction
#define ROOT_TPyFitFunction

//////////////////////////////////////////////////////////////////////////////
//                                                                          //
// TPyFitFunction                                                           //
//                                                                          //
// Python base class to work with Math::IMultiGenFunction                   //
//                                                                          //
//////////////////////////////////////////////////////////////////////////////


//- ROOT
#ifndef ROOT_Math_IFunction
#include "Math/IFunction.h"
#endif
#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif

// Python
struct _object;
typedef _object PyObject;


class TPyMultiGenFunction : public ROOT::Math::IMultiGenFunction {
public:
// ctor/dtor, and assignment
   TPyMultiGenFunction( PyObject* self = 0 );
   virtual ~TPyMultiGenFunction();

// Math::IMultiGenFunction implementation
   virtual ROOT::Math::IBaseFunctionMultiDim* Clone() const
      { return new TPyMultiGenFunction( fPySelf ); }
   virtual unsigned int NDim() const;
   virtual double DoEval( const double* x ) const;

   ClassDef( TPyMultiGenFunction, 1 );   //Python for Math::IMultiGenFunction equivalent

private:
// to prevent confusion when handing 'self' from python
   TPyMultiGenFunction( const TPyMultiGenFunction& src ) : ROOT::Math::IMultiGenFunction( src ) {}
   TPyMultiGenFunction& operator=( const TPyMultiGenFunction& ) { return *this; }

private:
   PyObject* fPySelf;              //! actual python object
};


class TPyMultiGradFunction : public ROOT::Math::IMultiGradFunction {
public:
// ctor/dtor, and assignment
   TPyMultiGradFunction( PyObject* self = 0 );
   virtual ~TPyMultiGradFunction();

// Math::IMultiGenFunction implementation
   virtual ROOT::Math::IBaseFunctionMultiDim* Clone() const
      { return new TPyMultiGradFunction( fPySelf ); }
   virtual unsigned int NDim() const;
   virtual double DoEval( const double* x ) const;

   virtual void Gradient( const double* x, double* grad ) const;
   virtual void FdF( const double* x, double& f, double* df ) const;
   virtual double DoDerivative( const double * x, unsigned int icoord ) const;

   ClassDef( TPyMultiGradFunction, 1 );   //Python for Math::IMultiGradFunction equivalent

private:
// to prevent confusion when handing 'self' from python
   TPyMultiGradFunction( const TPyMultiGradFunction& src ) :
       ROOT::Math::IMultiGenFunction( src ), ROOT::Math::IMultiGradFunction( src ) {}
   TPyMultiGradFunction& operator=( const TPyMultiGradFunction& ) { return *this; }

private:
   PyObject* fPySelf;              //! actual python object
};

#endif
 TPyFitFunction.h:1
 TPyFitFunction.h:2
 TPyFitFunction.h:3
 TPyFitFunction.h:4
 TPyFitFunction.h:5
 TPyFitFunction.h:6
 TPyFitFunction.h:7
 TPyFitFunction.h:8
 TPyFitFunction.h:9
 TPyFitFunction.h:10
 TPyFitFunction.h:11
 TPyFitFunction.h:12
 TPyFitFunction.h:13
 TPyFitFunction.h:14
 TPyFitFunction.h:15
 TPyFitFunction.h:16
 TPyFitFunction.h:17
 TPyFitFunction.h:18
 TPyFitFunction.h:19
 TPyFitFunction.h:20
 TPyFitFunction.h:21
 TPyFitFunction.h:22
 TPyFitFunction.h:23
 TPyFitFunction.h:24
 TPyFitFunction.h:25
 TPyFitFunction.h:26
 TPyFitFunction.h:27
 TPyFitFunction.h:28
 TPyFitFunction.h:29
 TPyFitFunction.h:30
 TPyFitFunction.h:31
 TPyFitFunction.h:32
 TPyFitFunction.h:33
 TPyFitFunction.h:34
 TPyFitFunction.h:35
 TPyFitFunction.h:36
 TPyFitFunction.h:37
 TPyFitFunction.h:38
 TPyFitFunction.h:39
 TPyFitFunction.h:40
 TPyFitFunction.h:41
 TPyFitFunction.h:42
 TPyFitFunction.h:43
 TPyFitFunction.h:44
 TPyFitFunction.h:45
 TPyFitFunction.h:46
 TPyFitFunction.h:47
 TPyFitFunction.h:48
 TPyFitFunction.h:49
 TPyFitFunction.h:50
 TPyFitFunction.h:51
 TPyFitFunction.h:52
 TPyFitFunction.h:53
 TPyFitFunction.h:54
 TPyFitFunction.h:55
 TPyFitFunction.h:56
 TPyFitFunction.h:57
 TPyFitFunction.h:58
 TPyFitFunction.h:59
 TPyFitFunction.h:60
 TPyFitFunction.h:61
 TPyFitFunction.h:62
 TPyFitFunction.h:63
 TPyFitFunction.h:64
 TPyFitFunction.h:65
 TPyFitFunction.h:66
 TPyFitFunction.h:67
 TPyFitFunction.h:68
 TPyFitFunction.h:69
 TPyFitFunction.h:70
 TPyFitFunction.h:71
 TPyFitFunction.h:72
 TPyFitFunction.h:73
 TPyFitFunction.h:74
 TPyFitFunction.h:75
 TPyFitFunction.h:76
 TPyFitFunction.h:77
 TPyFitFunction.h:78
 TPyFitFunction.h:79
 TPyFitFunction.h:80