File indexing completed on 2025-01-18 10:10:17
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef ROOT_Math_IntegratorMultiDim
0015 #define ROOT_Math_IntegratorMultiDim
0016
0017
0018 #include "Math/IFunctionfwd.h"
0019
0020 #include "Math/AllIntegrationTypes.h"
0021
0022 #include "Math/IntegratorOptions.h"
0023
0024 #include "Math/VirtualIntegrator.h"
0025
0026 #include "Math/WrappedFunction.h"
0027
0028 #include <memory>
0029 #include <string>
0030
0031 namespace ROOT {
0032 namespace Math {
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 class IntegratorMultiDim {
0048
0049 public:
0050
0051 typedef IntegrationMultiDim::Type Type;
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 explicit
0064 IntegratorMultiDim(IntegrationMultiDim::Type type = IntegrationMultiDim::kDEFAULT, double absTol = -1, double relTol = -1, unsigned int ncall = 0) :
0065 fIntegrator(nullptr)
0066 {
0067 fIntegrator = CreateIntegrator(type, absTol, relTol, ncall);
0068 }
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078 explicit
0079 IntegratorMultiDim(const IMultiGenFunction &f, IntegrationMultiDim::Type type = IntegrationMultiDim::kDEFAULT, double absTol = -1, double relTol = -1, unsigned int ncall = 0) :
0080 fIntegrator(nullptr)
0081 {
0082 fIntegrator = CreateIntegrator(type, absTol, relTol, ncall);
0083 SetFunction(f);
0084 }
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105 virtual ~IntegratorMultiDim() {
0106 if (fIntegrator) delete fIntegrator;
0107 }
0108
0109
0110
0111
0112 private:
0113 IntegratorMultiDim(const IntegratorMultiDim &) : fIntegrator(nullptr), fFunc(nullptr) {}
0114 IntegratorMultiDim & operator=(const IntegratorMultiDim &) { return *this; }
0115
0116 public:
0117
0118
0119
0120
0121
0122 double Integral(const double* xmin, const double * xmax) {
0123 return !fIntegrator ? 0 : fIntegrator->Integral(xmin,xmax);
0124 }
0125
0126
0127 double Integral(const IMultiGenFunction &f, const double* xmin, const double * xmax) {
0128 SetFunction(f);
0129 return Integral(xmin,xmax);
0130 }
0131
0132
0133 template<class Function>
0134 double Integral(Function & f , unsigned int dim, const double* xmin, const double * xmax) {
0135 SetFunction<Function>(f,dim);
0136 return Integral(xmin, xmax);
0137 }
0138
0139
0140
0141
0142
0143
0144 template <class Function>
0145 void SetFunction(Function & f, unsigned int dim) {
0146 fFunc.reset(new WrappedMultiFunction<Function &> (f, dim) );
0147 fIntegrator->SetFunction(*fFunc);
0148 }
0149
0150
0151 void SetFunction(const IMultiGenFunction &f) {
0152 if (fIntegrator) fIntegrator->SetFunction(f);
0153 }
0154
0155
0156 double Result() const { return !fIntegrator ? 0 : fIntegrator->Result(); }
0157
0158
0159 double Error() const { return !fIntegrator ? 0 : fIntegrator->Error(); }
0160
0161
0162 int Status() const { return !fIntegrator ? -1 : fIntegrator->Status(); }
0163
0164
0165
0166
0167
0168 void SetRelTolerance(double relTol) { if (fIntegrator) fIntegrator->SetRelTolerance(relTol); }
0169
0170
0171 void SetAbsTolerance(double absTol) { if (fIntegrator) fIntegrator->SetAbsTolerance(absTol); }
0172
0173
0174 void SetOptions(const ROOT::Math::IntegratorMultiDimOptions & opt) { if (fIntegrator) fIntegrator->SetOptions(opt); }
0175
0176
0177 ROOT::Math::IntegratorMultiDimOptions Options() const { return fIntegrator ? fIntegrator->Options() : IntegratorMultiDimOptions(); }
0178
0179
0180 VirtualIntegratorMultiDim * GetIntegrator() { return fIntegrator; }
0181
0182
0183 std::string Name() const { return fIntegrator ? Options().Integrator() : std::string(""); }
0184
0185
0186 static IntegrationMultiDim::Type GetType(const char * name);
0187
0188
0189 static std::string GetName(IntegrationMultiDim::Type);
0190
0191 protected:
0192
0193 VirtualIntegratorMultiDim * CreateIntegrator(IntegrationMultiDim::Type type , double absTol, double relTol, unsigned int ncall);
0194
0195 private:
0196
0197 VirtualIntegratorMultiDim * fIntegrator;
0198 std::unique_ptr<IMultiGenFunction> fFunc;
0199
0200
0201 };
0202
0203 }
0204 }
0205
0206 #endif