// @(#)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

#ifndef ROOT_Math_IntegratorOptions
#include "Math/IntegratorOptions.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;

   /**
      return number of function evaluations in calculating the integral
      (if integrator do not implement this function returns -1)
   */
   virtual int NEval() const { return -1; }




};

//___________________________________________________________________
/**
   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
   virtual void SetFunction(const IGenFunction &) = 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;

   ///  get the option used for the integration
   /// must be implemented by derived class
   virtual ROOT::Math::IntegratorOneDimOptions Options() const = 0;

   // return type of integrator
   virtual ROOT::Math::IntegrationOneDim::Type Type() const {
      return Options().IntegratorType();
   }

   /// set the options
   /// (should be re-implemented by derived classes -if more options than tolerance exist
   virtual void SetOptions(const ROOT::Math::IntegratorOneDimOptions & opt) {
      SetRelTolerance(opt.RelTolerance() );
      SetAbsTolerance(opt.AbsTolerance() );
   }



};

//___________________________________________________________________
/**
   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;

   ///  get the option used for the integration
   /// impelement by derived class otherwise return default ones
   virtual ROOT::Math::IntegratorMultiDimOptions Options() const = 0;

   // return type of integrator
   virtual ROOT::Math::IntegrationMultiDim::Type Type() const {
      return Options().IntegratorType();
   }

   /// set the options (if needed must be re-implemented by derived classes)
   virtual void SetOptions(const ROOT::Math::IntegratorMultiDimOptions & opt) {
      SetRelTolerance(opt.RelTolerance() );
      SetAbsTolerance(opt.AbsTolerance() );
   }


};


}//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
 VirtualIntegrator.h:162
 VirtualIntegrator.h:163
 VirtualIntegrator.h:164
 VirtualIntegrator.h:165
 VirtualIntegrator.h:166
 VirtualIntegrator.h:167
 VirtualIntegrator.h:168
 VirtualIntegrator.h:169
 VirtualIntegrator.h:170
 VirtualIntegrator.h:171
 VirtualIntegrator.h:172
 VirtualIntegrator.h:173
 VirtualIntegrator.h:174
 VirtualIntegrator.h:175
 VirtualIntegrator.h:176
 VirtualIntegrator.h:177
 VirtualIntegrator.h:178
 VirtualIntegrator.h:179
 VirtualIntegrator.h:180
 VirtualIntegrator.h:181
 VirtualIntegrator.h:182
 VirtualIntegrator.h:183
 VirtualIntegrator.h:184
 VirtualIntegrator.h:185
 VirtualIntegrator.h:186
 VirtualIntegrator.h:187
 VirtualIntegrator.h:188
 VirtualIntegrator.h:189
 VirtualIntegrator.h:190
 VirtualIntegrator.h:191
 VirtualIntegrator.h:192
 VirtualIntegrator.h:193
 VirtualIntegrator.h:194
 VirtualIntegrator.h:195
 VirtualIntegrator.h:196
 VirtualIntegrator.h:197
 VirtualIntegrator.h:198
 VirtualIntegrator.h:199
 VirtualIntegrator.h:200
 VirtualIntegrator.h:201
 VirtualIntegrator.h:202
 VirtualIntegrator.h:203
 VirtualIntegrator.h:204
 VirtualIntegrator.h:205
 VirtualIntegrator.h:206
 VirtualIntegrator.h:207
 VirtualIntegrator.h:208