1 #ifndef __BCINTEGRATE__H
2 #define __BCINTEGRATE__H
26 #include "BCEngineMCMC.h"
40 namespace BCCubaOptions
44 int ncomp, flags, nregions, neval, fail;
53 int nstart, nincrease, nbatch, gridno;
68 int key1, key2, key3, maxpass;
69 double border, maxchisq, mindeviation;
93 enum BCOptimizationMethod {
103 enum BCIntegrationMethod {
113 enum BCMarginalizationMethod {
123 enum BCSASchedule { kSACauchy, kSABoltzmann, kSACustom, NSAMethods };
127 enum BCCubaMethod { kCubaVegas, kCubaSuave, kCubaDivonne, kCubaCuhre, NCubaMethods};
136 typedef void (
BCIntegrate::*tRandomizer)(std::vector<double> &)
const;
140 typedef double (
BCIntegrate::*tEvaluator)(std::vector<double> &,
const std::vector<double> &,
bool &);
144 typedef void (*tIntegralUpdater)(
const std::vector<double> &,
const int &,
double &,
double &);
178 int ReadMarginalizedFromFile(
const char * file);
196 BCH1D * GetMarginalized(
const char * name)
197 {
return GetMarginalized(fParameters.Index(name)); }
206 BCH1D * GetMarginalized(
unsigned index);
227 BCH2D * GetMarginalized(
const char * name1,
const char * name2)
228 {
return GetMarginalized(fParameters.Index(name1), fParameters.Index(name2)); }
238 BCH2D * GetMarginalized(
unsigned index1,
unsigned index2);
242 int PrintAllMarginalized1D(
const char * filebase);
243 int PrintAllMarginalized2D(
const char * filebase);
244 int PrintAllMarginalized(
const char * file, std::string options1d=
"BTsiB3CS1D0pdf0Lmeanmode", std::string options2d=
"BTfB3CS1meangmode",
unsigned int hdiv=1,
unsigned int ndiv=1);
249 double GetIntegral()
const
250 {
return fIntegral; }
254 BCIntegrate::BCOptimizationMethod GetOptimizationMethod()
const
255 {
return fOptimizationMethodCurrent; }
259 BCIntegrate::BCIntegrationMethod GetIntegrationMethod()
const
260 {
return fIntegrationMethodCurrent; }
264 BCIntegrate::BCMarginalizationMethod GetMarginalizationMethod()
const
265 {
return fMarginalizationMethodCurrent; }
269 BCIntegrate::BCSASchedule GetSASchedule()
const
270 {
return fSASchedule; }
275 void GetRandomVectorUnitHypercube(std::vector<double> &x)
const;
280 void GetRandomVectorInParameterSpace(std::vector<double> &x)
const;
287 double GetRandomPoint(std::vector<double> &x);
291 int GetNIterationsMin()
const
292 {
return fNIterationsMin; }
296 int GetNIterationsMax()
const
297 {
return fNIterationsMax; }
301 int GetNIterationsPrecisionCheck()
const
302 {
return fNIterationsPrecisionCheck; }
306 int GetNIterationsOutput()
const
307 {
return fNIterationsOutput; }
311 int GetNIterations()
const
312 {
return fNIterations; }
316 double GetRelativePrecision()
const
317 {
return fRelativePrecision; }
321 double GetAbsolutePrecision()
const
322 {
return fAbsolutePrecision; }
326 BCCubaMethod GetCubaIntegrationMethod()
const
327 {
return fCubaIntegrationMethod; }
333 {
return fCubaVegasOptions; }
336 {
return fCubaSuaveOptions; }
339 {
return fCubaDivonneOptions; }
342 {
return fCubaCuhreOptions; }
351 BCH1D* GetSlice(
const BCParameter* parameter,
const std::vector<double> parameters = std::vector<double>(0),
int bins=0,
bool flag_norm=
true);
360 BCH1D* GetSlice(
const char * name,
const std::vector<double> parameters = std::vector<double>(0),
int nbins=0,
bool flag_norm=
true)
361 {
return GetSlice(GetParameter(name), parameters, nbins, flag_norm); }
371 BCH2D* GetSlice(
const BCParameter* parameter1,
const BCParameter* parameter2,
const std::vector<double> parameters = std::vector<double>(0),
int bins=0,
bool flag_norm=
true);
381 BCH2D* GetSlice(
const char* name1,
const char* name2,
const std::vector<double> parameters = std::vector<double>(0),
int nbins=0,
bool flag_norm=
true);
391 BCH2D* GetSlice(
unsigned index1,
unsigned index2,
const std::vector<double> parameters = std::vector<double>(0),
int nbins=0,
bool flag_norm=
true);
395 double GetError()
const
400 TMinuit * GetMinuit();
404 int GetMinuitErrorFlag()
const
405 {
return fMinuitErrorFlag; }
409 double GetSAT0()
const
414 double GetSATmin()
const
422 double GetBestFitParameter(
unsigned index)
const;
429 double GetBestFitParameterError(
unsigned index)
const;
434 double GetLogMaximum()
435 {
return fLogMaximum; };
441 const std::vector<double> & GetBestFitParameters()
const
442 {
return fBestFitParameters; }
446 const std::vector<double> & GetBestFitParameterErrors()
const
447 {
return fBestFitParameterErrors; }
456 void SetMinuitArlist(
double * arglist)
457 { fMinuitArglist[0] = arglist[0];
458 fMinuitArglist[1] = arglist[1]; }
462 void SetFlagIgnorePrevOptimization(
bool flag)
463 { fFlagIgnorePrevOptimization = flag; }
467 void SetOptimizationMethod(BCIntegrate::BCOptimizationMethod method)
468 { fOptimizationMethodCurrent = method; }
472 void SetIntegrationMethod(BCIntegrate::BCIntegrationMethod method);
476 void SetMarginalizationMethod(BCIntegrate::BCMarginalizationMethod method)
477 { fMarginalizationMethodCurrent = method; }
481 void SetSASchedule(BCIntegrate::BCSASchedule schedule)
482 { fSASchedule = schedule; }
486 void SetNIterationsMin(
int niterations)
487 { fNIterationsMin = niterations; }
491 void SetNIterationsMax(
int niterations)
492 { fNIterationsMax = niterations; }
496 void SetNIterationsPrecisionCheck(
int niterations)
497 { fNIterationsPrecisionCheck = niterations; }
501 void SetNIterationsOutput(
int niterations)
502 { fNIterationsOutput = niterations; }
507 void SetRelativePrecision(
double relprecision)
508 { fRelativePrecision = relprecision; }
512 void SetAbsolutePrecision(
double absprecision)
513 { fAbsolutePrecision = absprecision; }
517 void SetCubaIntegrationMethod(BCCubaMethod type);
523 { fCubaVegasOptions = options; }
526 { fCubaSuaveOptions = options; }
529 { fCubaDivonneOptions = options; }
532 { fCubaCuhreOptions = options; }
536 void SetSAT0(
double T0)
541 void SetSATmin(
double Tmin)
544 void SetFlagWriteSAToFile(
bool flag)
545 { fFlagWriteSAToFile = flag; }
554 void InitializeSATree();
566 virtual double Eval(
const std::vector<double> &x);
573 virtual double LogEval(
const std::vector<double> &x);
578 {
return Integrate(); };
584 double Integrate(BCIntegrationMethod intmethod);
601 double Integrate(BCIntegrationMethod type, tRandomizer randomizer, tEvaluator evaluator, tIntegralUpdater updater, std::vector<double> &sums);
604 double EvaluatorMC(std::vector<double> &sums,
const std::vector<double> &point,
bool &accepted);
605 static void IntegralUpdaterMC(
const std::vector<double> &sums,
const int &nIterations,
double &integral,
double &absprecision);
614 static int CubaIntegrand(
const int * ndim,
const double xx[],
const int * ncomp,
double ff[],
void *userdata);
616 TH1D * Marginalize(BCIntegrationMethod type,
unsigned index);
618 TH2D * Marginalize(BCIntegrationMethod type,
unsigned index1,
unsigned index2);
620 bool Marginalize(TH1* hist, BCIntegrationMethod type,
const std::vector<unsigned> &index);
627 int MarginalizeAll();
635 int MarginalizeAll(BCMarginalizationMethod margmethod);
640 virtual void MarginalizePreprocess()
646 virtual void MarginalizePostprocess()
664 std::vector<double> FindMode(std::vector<double> start = std::vector<double>());
672 std::vector<double> FindMode(BCIntegrate::BCOptimizationMethod optmethod, std::vector<double> start = std::vector<double>());
679 double SATemperature(
double t);
685 double SATemperatureBoltzmann(
double t);
691 double SATemperatureCauchy(
double t);
698 virtual double SATemperatureCustom(
double t);
707 std::vector<double> GetProposalPointSA(
const std::vector<double> &x,
int t);
715 std::vector<double> GetProposalPointSABoltzmann(
const std::vector<double> &x,
int t);
723 std::vector<double> GetProposalPointSACauchy(
const std::vector<double> &x,
int t);
732 virtual std::vector<double> GetProposalPointSACustom(
const std::vector<double> &x,
int t);
738 std::vector<double> SAHelperGetRandomPointOnHypersphere();
743 double SAHelperGetRadialCauchy();
748 double SAHelperSinusToNIntegral(
int dim,
double theta);
751 static void FCNLikelihood(
int &npar,
double * grad,
double &fval,
double * par,
int flag);
755 virtual void ResetResults();
761 std::string DumpIntegrationMethod(BCIntegrationMethod type);
766 std::string DumpCurrentIntegrationMethod()
767 {
return DumpIntegrationMethod(fIntegrationMethodCurrent); }
772 std::string DumpUsedIntegrationMethod()
773 {
return DumpIntegrationMethod(fIntegrationMethodUsed); }
779 std::string DumpMarginalizationMethod(BCMarginalizationMethod type);
784 std::string DumpCurrentMarginalizationMethod()
785 {
return DumpMarginalizationMethod(fMarginalizationMethodCurrent); }
790 std::string DumpUsedMarginalizationMethod()
791 {
return DumpMarginalizationMethod(fMarginalizationMethodUsed); }
797 std::string DumpOptimizationMethod(BCOptimizationMethod type);
802 std::string DumpCurrentOptimizationMethod()
803 {
return DumpOptimizationMethod(fOptimizationMethodCurrent); }
808 std::string DumpUsedOptimizationMethod()
809 {
return DumpOptimizationMethod(fOptimizationMethodUsed); }
815 std::string DumpCubaIntegrationMethod(BCCubaMethod type);
820 std::string DumpCubaIntegrationMethod()
821 {
return DumpCubaIntegrationMethod(fCubaIntegrationMethod); }
825 void SetBestFitParameters(
const std::vector<double> &x)
826 { fBestFitParameters = x; }
832 void SetBestFitParameters(
const std::vector<double> &x,
const double &new_value,
double &old_value);
837 unsigned GetNIntegrationVariables();
842 double CalculateIntegrationVolume();
846 bool CheckMarginalizationAvailability(BCMarginalizationMethod type);
850 bool CheckMarginalizationIndices(TH1* hist,
const std::vector<unsigned> &index);
864 double fMinuitArglist[2];
865 int fMinuitErrorFlag;
869 bool fFlagIgnorePrevOptimization;
885 bool fFlagWriteSAToFile;
888 double fSATemperature;
890 std::vector<double> fSAx;
894 std::vector<BCH1D*> fMarginalized1D;
898 std::vector<BCH2D*> fMarginalized2D;
903 unsigned IntegrationOutputFrequency()
const;
910 void LogOutputAtStartOfIntegration(BCIntegrationMethod type, BCCubaMethod cubatype);
911 void LogOutputAtIntegrationStatusUpdate(BCIntegrationMethod type,
double integral,
double absprecision,
int nIterations);
912 void LogOutputAtEndOfIntegration(
double integral,
double absprecision,
double relprecision,
int nIterations);
921 bool fFlagMarginalized;
935 std::vector<double> FindModeMinuit(std::vector<double> &mode, std::vector<double> &errors, std::vector<double> start = std::vector<double>(0),
int printlevel = 1);
944 std::vector<double> FindModeMCMC(std::vector<double> &mode, std::vector<double> &errors);
956 std::vector<double> FindModeSA(std::vector<double> &mode, std::vector<double> &errors, std::vector<double> start = std::vector<double>(0));
961 double IntegrateCuba()
962 {
return IntegrateCuba(fCubaIntegrationMethod); }
968 double IntegrateCuba(BCCubaMethod cubatype);
973 double IntegrateSlice();
977 BCIntegrate::BCOptimizationMethod fOptimizationMethodCurrent;
982 BCIntegrate::BCOptimizationMethod fOptimizationMethodUsed;
986 BCIntegrate::BCIntegrationMethod fIntegrationMethodCurrent;
990 BCIntegrate::BCIntegrationMethod fIntegrationMethodUsed;
994 BCIntegrate::BCMarginalizationMethod fMarginalizationMethodCurrent;
998 BCIntegrate::BCMarginalizationMethod fMarginalizationMethodUsed;
1002 BCIntegrate::BCSASchedule fSASchedule;
1006 unsigned fNIterationsMin;
1010 unsigned fNIterationsMax;
1014 unsigned fNIterationsPrecisionCheck;
1018 unsigned fNIterationsOutput;
1026 std::vector<double> fBestFitParameters;
1030 std::vector<double> fBestFitParameterErrors;
1041 double fRelativePrecision;
1044 double fAbsolutePrecision;
1051 BCCubaMethod fCubaIntegrationMethod;
A class for handling numerical operations for models.
A class for handling 2D distributions.
A class representing a parameter of a model.
An engine class for Markov Chain Monte Carlo.
A class for handling 1D distributions.