ROOT logo
// @(#)root/mathcore:$Id$
// Author: Magdalena Slawinska 10/2007


/**********************************************************************
 *                                                                    *
 * Copyright (c) 2007  LCG ROOT Math Team, CERN/PH-SFT                *
 *                                                                    *
 *                                                                    *
 **********************************************************************/

// Header file for class Minimizer

#ifndef ROOT_Math_VirtualIntegrator
#define ROOT_Math_VirtualIntegrator

#ifndef ROOT_Math_IFunctionfwd
#include "Math/IFunctionfwd.h"
#endif

#ifndef ROOT_Math_Error
#include "Math/Error.h"
#endif

#include <vector>


namespace ROOT {
namespace Math {

//___________________________________________________________________
/**
   Abstract class for all numerical integration methods (1D and multi-dim) 
   Interface defining the common methods for the 
   numerical integrator classes of one and multi dimensions 
   The derived class VirtualIntegratorOneDim defines the methods 
   for one-dimensional integration.
   The derived class VirtualIntegratorMultiDim defines the method for 
   multi-dimensional integration. 
   The concrete classes for one dimension (e.g. GSLIntegrator) or 
   multi-dimension (e.g. GSLMCIntegrator) can be created using the 
   plug-in manager. 
   Users should not use directly this class but the concrete classes ROOT::Math::IntegratorOneDim or 
   ROOT::Math::IntegratorMultiDim
   

   @ingroup  Integration

*/
class VirtualIntegrator{

public:

   // destructor: no operation
   virtual ~VirtualIntegrator() {}

   /**
      set the desired relative Error
   */
   virtual void SetRelTolerance(double ) = 0; 

   /**
      set the desired absolute Error
   */
   virtual void SetAbsTolerance(double ) = 0; 

   /**
      return  the Result of the last Integral calculation
   */
   virtual double Result() const = 0; 

   /**
      return the estimate of the absolute Error of the last Integral calculation
   */
   virtual double Error() const = 0; 
   
   /**
      return the Error Status of the last Integral calculation
   */
   virtual int Status() const = 0;

}; 

//___________________________________________________________________
/**
   Interface (abstract) class for 1D numerical integration
   It must be implemented by the concrate Integrator classes like
   ROOT::Math::GSLIntegrator. 
   Plug-in's exist in ROOT to be able to instantiate the derived classes via the 
   plug-in manager. 
   Users should not use directly this class but the concrete classes ROOT::Math::IntegratorOneDim.


   @ingroup  Integration

*/
class VirtualIntegratorOneDim : public VirtualIntegrator {

public:

   /// destructor: no operation
   virtual ~VirtualIntegratorOneDim() {}

   /// evaluate integral 
   virtual double Integral(double a, double b) = 0; 

   /// set integration function (flag control if function must be copied inside)
   virtual void SetFunction(const IGenFunction &, bool copy =  false) = 0; 

   /// evaluate un-defined  integral (between -inf, + inf)
   virtual double Integral() = 0; 

   /// evaluate integral over the (a, +inf)
   virtual double IntegralUp(double a) = 0; 

   /// evaluate integral over the (-inf, b)
   virtual double IntegralLow(double b) = 0; 

   /// evaluate integral with singular points
   virtual double Integral( const std::vector<double> & pts) = 0; 

   /// evaluate Cauchy integral 
   virtual double IntegralCauchy(double a, double b, double c) = 0; 

};

//___________________________________________________________________
/**
   Interface (abstract) class for multi numerical integration
   It must be implemented by the concrete Integrator classes like
   ROOT::Math::GSLMCIntegrator. 
   Plug-in's exist in ROOT to be able to instantiate the derived classes via the 
   plug-in manager.
   Users should not use directly this class but the concrete classes ROOT::Math::IntegratorMultiDim.


   @ingroup  Integration

*/
class VirtualIntegratorMultiDim : public VirtualIntegrator { 

public:

   /// destructor: no operation
   virtual ~VirtualIntegratorMultiDim() {}

   /// evaluate multi-dim integral
   virtual double Integral(const double*, const double*)  = 0;  

   /// setting a multi-dim function
   virtual void SetFunction(const IMultiGenFunction &)  = 0; 

   
};


}//namespace Math
}//namespace ROOT


#endif /* ROOT_Math_VirtualIntegrator */
 VirtualIntegrator.h:1
 VirtualIntegrator.h:2
 VirtualIntegrator.h:3
 VirtualIntegrator.h:4
 VirtualIntegrator.h:5
 VirtualIntegrator.h:6
 VirtualIntegrator.h:7
 VirtualIntegrator.h:8
 VirtualIntegrator.h:9
 VirtualIntegrator.h:10
 VirtualIntegrator.h:11
 VirtualIntegrator.h:12
 VirtualIntegrator.h:13
 VirtualIntegrator.h:14
 VirtualIntegrator.h:15
 VirtualIntegrator.h:16
 VirtualIntegrator.h:17
 VirtualIntegrator.h:18
 VirtualIntegrator.h:19
 VirtualIntegrator.h:20
 VirtualIntegrator.h:21
 VirtualIntegrator.h:22
 VirtualIntegrator.h:23
 VirtualIntegrator.h:24
 VirtualIntegrator.h:25
 VirtualIntegrator.h:26
 VirtualIntegrator.h:27
 VirtualIntegrator.h:28
 VirtualIntegrator.h:29
 VirtualIntegrator.h:30
 VirtualIntegrator.h:31
 VirtualIntegrator.h:32
 VirtualIntegrator.h:33
 VirtualIntegrator.h:34
 VirtualIntegrator.h:35
 VirtualIntegrator.h:36
 VirtualIntegrator.h:37
 VirtualIntegrator.h:38
 VirtualIntegrator.h:39
 VirtualIntegrator.h:40
 VirtualIntegrator.h:41
 VirtualIntegrator.h:42
 VirtualIntegrator.h:43
 VirtualIntegrator.h:44
 VirtualIntegrator.h:45
 VirtualIntegrator.h:46
 VirtualIntegrator.h:47
 VirtualIntegrator.h:48
 VirtualIntegrator.h:49
 VirtualIntegrator.h:50
 VirtualIntegrator.h:51
 VirtualIntegrator.h:52
 VirtualIntegrator.h:53
 VirtualIntegrator.h:54
 VirtualIntegrator.h:55
 VirtualIntegrator.h:56
 VirtualIntegrator.h:57
 VirtualIntegrator.h:58
 VirtualIntegrator.h:59
 VirtualIntegrator.h:60
 VirtualIntegrator.h:61
 VirtualIntegrator.h:62
 VirtualIntegrator.h:63
 VirtualIntegrator.h:64
 VirtualIntegrator.h:65
 VirtualIntegrator.h:66
 VirtualIntegrator.h:67
 VirtualIntegrator.h:68
 VirtualIntegrator.h:69
 VirtualIntegrator.h:70
 VirtualIntegrator.h:71
 VirtualIntegrator.h:72
 VirtualIntegrator.h:73
 VirtualIntegrator.h:74
 VirtualIntegrator.h:75
 VirtualIntegrator.h:76
 VirtualIntegrator.h:77
 VirtualIntegrator.h:78
 VirtualIntegrator.h:79
 VirtualIntegrator.h:80
 VirtualIntegrator.h:81
 VirtualIntegrator.h:82
 VirtualIntegrator.h:83
 VirtualIntegrator.h:84
 VirtualIntegrator.h:85
 VirtualIntegrator.h:86
 VirtualIntegrator.h:87
 VirtualIntegrator.h:88
 VirtualIntegrator.h:89
 VirtualIntegrator.h:90
 VirtualIntegrator.h:91
 VirtualIntegrator.h:92
 VirtualIntegrator.h:93
 VirtualIntegrator.h:94
 VirtualIntegrator.h:95
 VirtualIntegrator.h:96
 VirtualIntegrator.h:97
 VirtualIntegrator.h:98
 VirtualIntegrator.h:99
 VirtualIntegrator.h:100
 VirtualIntegrator.h:101
 VirtualIntegrator.h:102
 VirtualIntegrator.h:103
 VirtualIntegrator.h:104
 VirtualIntegrator.h:105
 VirtualIntegrator.h:106
 VirtualIntegrator.h:107
 VirtualIntegrator.h:108
 VirtualIntegrator.h:109
 VirtualIntegrator.h:110
 VirtualIntegrator.h:111
 VirtualIntegrator.h:112
 VirtualIntegrator.h:113
 VirtualIntegrator.h:114
 VirtualIntegrator.h:115
 VirtualIntegrator.h:116
 VirtualIntegrator.h:117
 VirtualIntegrator.h:118
 VirtualIntegrator.h:119
 VirtualIntegrator.h:120
 VirtualIntegrator.h:121
 VirtualIntegrator.h:122
 VirtualIntegrator.h:123
 VirtualIntegrator.h:124
 VirtualIntegrator.h:125
 VirtualIntegrator.h:126
 VirtualIntegrator.h:127
 VirtualIntegrator.h:128
 VirtualIntegrator.h:129
 VirtualIntegrator.h:130
 VirtualIntegrator.h:131
 VirtualIntegrator.h:132
 VirtualIntegrator.h:133
 VirtualIntegrator.h:134
 VirtualIntegrator.h:135
 VirtualIntegrator.h:136
 VirtualIntegrator.h:137
 VirtualIntegrator.h:138
 VirtualIntegrator.h:139
 VirtualIntegrator.h:140
 VirtualIntegrator.h:141
 VirtualIntegrator.h:142
 VirtualIntegrator.h:143
 VirtualIntegrator.h:144
 VirtualIntegrator.h:145
 VirtualIntegrator.h:146
 VirtualIntegrator.h:147
 VirtualIntegrator.h:148
 VirtualIntegrator.h:149
 VirtualIntegrator.h:150
 VirtualIntegrator.h:151
 VirtualIntegrator.h:152
 VirtualIntegrator.h:153
 VirtualIntegrator.h:154
 VirtualIntegrator.h:155
 VirtualIntegrator.h:156
 VirtualIntegrator.h:157
 VirtualIntegrator.h:158
 VirtualIntegrator.h:159
 VirtualIntegrator.h:160
 VirtualIntegrator.h:161