1
0
mirror of https://github.com/aportelli/LatAnalyze.git synced 2025-04-10 19:20:44 +01:00

Minuit minimiser: interface to choose algorithm

This commit is contained in:
Antonin Portelli 2015-08-07 16:10:03 +02:00
parent 6202ed4518
commit af3023038b
2 changed files with 35 additions and 5 deletions

View File

@ -62,11 +62,17 @@ double MinuitMinimizer::MinuitFunction::Up(void) const
} }
// constructor ///////////////////////////////////////////////////////////////// // constructor /////////////////////////////////////////////////////////////////
MinuitMinimizer::MinuitMinimizer(const Index dim) MinuitMinimizer::MinuitMinimizer(const Index dim, const Algorithm algorithm)
: Minimizer(dim) : Minimizer(dim)
, algorithm_(algorithm)
{} {}
// access ////////////////////////////////////////////////////////////////////// // access //////////////////////////////////////////////////////////////////////
MinuitMinimizer::Algorithm MinuitMinimizer::getAlgorithm(void) const
{
return algorithm_;
}
double MinuitMinimizer::getPrecision(void) const double MinuitMinimizer::getPrecision(void) const
{ {
LATAN_ERROR(Implementation, LATAN_ERROR(Implementation,
@ -75,6 +81,11 @@ double MinuitMinimizer::getPrecision(void) const
return 0.; return 0.;
} }
void MinuitMinimizer::setAlgorithm(const Algorithm algorithm)
{
algorithm_ = algorithm;
}
void MinuitMinimizer::setPrecision(const double precision __dumb) void MinuitMinimizer::setPrecision(const double precision __dumb)
{ {
LATAN_ERROR(Implementation, LATAN_ERROR(Implementation,
@ -134,13 +145,21 @@ const DVec & MinuitMinimizer::operator()(const DoubleFunction &f)
} }
// minimization and output // minimization and output
MnMigrad minimizer(minuitF, parameters, 2); unique_ptr<MnApplication> minimizer(nullptr);
if (algorithm_ == Algorithm::Migrad)
{
minimizer.reset(new MnMigrad(minuitF, parameters, 2));
}
else if (algorithm_ == Algorithm::Simplex)
{
minimizer.reset(new MnSimplex(minuitF, parameters, 2));
}
unsigned int iTry = 0; unsigned int iTry = 0;
FunctionMinimum min = minimizer(); FunctionMinimum min = (*minimizer)();
while ((!min.IsValid())&&(iTry < maxTry)) while ((!min.IsValid())&&(iTry < maxTry))
{ {
min = minimizer(); min = (*minimizer)();
iTry++; iTry++;
} }
if (!min.IsValid()) if (!min.IsValid())

View File

@ -33,6 +33,12 @@ BEGIN_LATAN_NAMESPACE
class MinuitMinimizer: public Minimizer class MinuitMinimizer: public Minimizer
{ {
public:
enum class Algorithm
{
Migrad = 1,
Simplex = 2
};
private: private:
class MinuitFunction: public ROOT::Minuit2::FCNBase class MinuitFunction: public ROOT::Minuit2::FCNBase
{ {
@ -49,14 +55,19 @@ private:
}; };
public: public:
// constructor // constructor
explicit MinuitMinimizer(const Index dim); explicit MinuitMinimizer(const Index dim,
const Algorithm algorithm = Algorithm::Migrad);
// destructor // destructor
virtual ~MinuitMinimizer(void) = default; virtual ~MinuitMinimizer(void) = default;
// access // access
virtual double getPrecision(void) const; virtual double getPrecision(void) const;
Algorithm getAlgorithm(void) const;
virtual void setPrecision(const double precision); virtual void setPrecision(const double precision);
void setAlgorithm(const Algorithm algorithm);
// minimization // minimization
virtual const DVec & operator()(const DoubleFunction &f); virtual const DVec & operator()(const DoubleFunction &f);
private:
Algorithm algorithm_;
}; };
END_LATAN_NAMESPACE END_LATAN_NAMESPACE