32 #ifndef ROOT_Math_GSLMCIntegrationWorkspace
33 #define ROOT_Math_GSLMCIntegrationWorkspace
35 #include "gsl/gsl_math.h"
36 #include "gsl/gsl_monte.h"
37 #include "gsl/gsl_monte_vegas.h"
38 #include "gsl/gsl_monte_miser.h"
39 #include "gsl/gsl_monte_plain.h"
49 class GSLMCIntegrationWorkspace {
53 GSLMCIntegrationWorkspace() {}
55 virtual ~GSLMCIntegrationWorkspace() { Clear(); }
57 virtual MCIntegration::Type Type()
const = 0;
59 virtual size_t NDim()
const {
return 0; }
62 virtual bool Init(
size_t dim) = 0;
65 virtual bool ReInit() = 0;
68 virtual void Clear() {}
72 virtual ROOT::Math::IOptions * Options()
const = 0;
82 class GSLVegasIntegrationWorkspace :
public GSLMCIntegrationWorkspace {
86 GSLVegasIntegrationWorkspace(
size_t dim = 0) :
89 if (dim > 0) Init(dim);
92 bool Init(
size_t dim) {
93 fWs = gsl_monte_vegas_alloc( dim);
94 if (fWs) SetVegasParameters();
100 if (!fWs)
return false;
101 int iret = gsl_monte_vegas_init( fWs );
102 SetVegasParameters();
107 if (fWs) gsl_monte_vegas_free( fWs);
111 gsl_monte_vegas_state * GetWS() {
return fWs; }
113 void SetParameters(
const struct VegasParameters &p) {
115 if (fWs) SetVegasParameters();
118 size_t NDim()
const {
return (fWs) ? fWs->dim : 0; }
120 double Result()
const {
return (fWs) ? fWs->result : -1;}
122 double Sigma()
const {
return (fWs) ? fWs->sigma : 0;}
124 double Chisq()
const {
return (fWs) ? fWs->chisq: -1;}
126 MCIntegration::Type Type()
const {
return MCIntegration::kVEGAS; }
128 const VegasParameters & Parameters()
const {
return fParams; }
129 VegasParameters & Parameters() {
return fParams; }
131 virtual ROOT::Math::IOptions * Options()
const {
138 void SetVegasParameters() {
139 fWs->alpha = fParams.alpha;
140 fWs->iterations = fParams.iterations;
141 fWs->stage = fParams.stage;
142 fWs->mode = fParams.mode;
143 fWs->verbose = fParams.verbose;
147 gsl_monte_vegas_state * fWs;
148 VegasParameters fParams;
156 class GSLMiserIntegrationWorkspace :
public GSLMCIntegrationWorkspace {
160 GSLMiserIntegrationWorkspace(
size_t dim = 0) :
161 fHaveNewParams(false),
164 if (dim > 0) Init(dim);
168 bool Init(
size_t dim) {
169 fWs = gsl_monte_miser_alloc( dim);
171 if (!fHaveNewParams) fParams = MiserParameters(dim);
172 if (fWs) SetMiserParameters();
178 if (!fWs)
return false;
179 int iret = gsl_monte_miser_init( fWs );
180 SetMiserParameters();
185 if (fWs) gsl_monte_miser_free( fWs);
189 gsl_monte_miser_state * GetWS() {
return fWs; }
191 void SetParameters(
const MiserParameters &p) {
193 fHaveNewParams =
true;
194 if (fWs) SetMiserParameters();
197 size_t NDim()
const {
return (fWs) ? fWs->dim : 0; }
199 MCIntegration::Type Type()
const {
return MCIntegration::kMISER; }
202 const MiserParameters & Parameters()
const {
return fParams; }
203 MiserParameters & Parameters() {
return fParams; }
205 virtual ROOT::Math::IOptions * Options()
const {
211 void SetMiserParameters()
213 fWs->estimate_frac = fParams.estimate_frac;
214 fWs->min_calls = fParams.min_calls;
215 fWs->min_calls_per_bisection = fParams.min_calls_per_bisection;
216 fWs->alpha = fParams.alpha;
217 fWs->dither = fParams.dither;
222 gsl_monte_miser_state * fWs;
223 MiserParameters fParams;
230 class GSLPlainIntegrationWorkspace :
public GSLMCIntegrationWorkspace{
234 GSLPlainIntegrationWorkspace() :
238 bool Init(
size_t dim) {
239 fWs = gsl_monte_plain_alloc( dim);
245 if (!fWs)
return false;
246 int iret = gsl_monte_plain_init( fWs );
247 return (iret == GSL_SUCCESS);
251 if (fWs) gsl_monte_plain_free( fWs);
255 gsl_monte_plain_state * GetWS() {
return fWs; }
259 MCIntegration::Type Type()
const {
return MCIntegration::kPLAIN; }
261 size_t NDim()
const {
return (fWs) ? fWs->dim : 0; }
263 virtual ROOT::Math::IOptions * Options()
const {
270 gsl_monte_plain_state * fWs;