Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions roofit/roofitcore/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ ROOT_STANDARD_LIBRARY_PACKAGE(RooFitCore
RooGenFunction.h
RooGenProdProj.h
RooGlobalFunc.h
RooGradMinimizerFcn.h
RooGrid.h
RooHistError.h
RooHistFunc.h
Expand Down Expand Up @@ -333,6 +334,7 @@ ROOT_STANDARD_LIBRARY_PACKAGE(RooFitCore
src/RooGenFunction.cxx
src/RooGenProdProj.cxx
src/RooGlobalFunc.cxx
src/RooGradMinimizerFcn.cxx
src/RooGrid.cxx
src/RooHist.cxx
src/RooHistError.cxx
Expand Down
86 changes: 86 additions & 0 deletions roofit/roofitcore/inc/RooGradMinimizerFcn.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*****************************************************************************
* Project: RooFit *
* Package: RooFitCore *
* @(#)root/roofitcore:$Id$
* Authors: *
* AL, Alfio Lazzaro, INFN Milan, alfio.lazzaro@mi.infn.it *
* PB, Patrick Bos, NL eScience Center, p.bos@esciencecenter.nl *
* VC, Vince Croft, DIANA / NYU, vincent.croft@cern.ch *
* *
* *
* Redistribution and use in source and binary forms, *
* with or without modification, are permitted according to the terms *
* listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
*****************************************************************************/

#ifndef ROO_GRAD_MINIMIZER_FCN
#define ROO_GRAD_MINIMIZER_FCN

#include "RooAbsMinimizerFcn.h"

#include "Minuit2/MnStrategy.h"
#include "Minuit2/MnMatrix.h" // MnAlgebraicVector
#include "Math/IFunction.h" // IMultiGradFunction
#include "Fit/ParameterSettings.h"
#include "Minuit2/NumericalDerivator.h"

#include <vector>

class RooGradMinimizerFcn : public ROOT::Math::IMultiGradFunction, public RooAbsMinimizerFcn {
public:
RooGradMinimizerFcn(RooAbsReal *funct, RooMinimizer *context, bool verbose = false);
RooGradMinimizerFcn(const RooGradMinimizerFcn &other);
ROOT::Math::IMultiGradFunction *Clone() const override;

ROOT::Minuit2::MnStrategy getStrategy() const;
double getErrorDef() const;
void setStrategy(int istrat);

Bool_t Synchronize(std::vector<ROOT::Fit::ParameterSettings> &parameter_settings, Bool_t optConst,
Bool_t verbose = kFALSE) override;

void synchronizeGradientParameterSettings(std::vector<ROOT::Fit::ParameterSettings> &parameter_settings) const;

inline bool returnsInMinuit2ParameterSpace() const override { return true; }
inline unsigned int NDim() const override { return getNDim(); }
inline void setStepTolerance(double step_tolerance) const { _gradf.SetStepTolerance(step_tolerance); }
inline void setGradTolerance(double grad_tolerance) const { _gradf.SetGradTolerance(grad_tolerance); }
inline void setNcycles(unsigned int ncycles) const { _gradf.SetNCycles(ncycles); }
inline void setErrorLevel(double error_level) const { _gradf.SetErrorLevel(error_level); }
inline std::string getFunctionName() const override { return _funct->GetName(); }
inline std::string getFunctionTitle() const override { return _funct->GetTitle(); }
inline void setOffsetting(Bool_t flag) override { _funct->enableOffsetting(flag); }

private:
void runDerivator(unsigned int i_component) const;

void resetHasBeenCalculatedFlags() const;
bool syncParameter(double x, std::size_t ix) const;
bool syncParameters(const double *x) const;

inline void setOptimizeConstOnFunction(RooAbsArg::ConstOpCode opcode, Bool_t doAlsoTrackingOpt) override
{
_funct->constOptimizeTestStatistic(opcode, doAlsoTrackingOpt);
}

public:
enum class GradientCalculatorMode { ExactlyMinuit2, AlmostMinuit2 };

private:
// IMultiGradFunction overrides
double DoEval(const double *x) const override;
double DoDerivative(const double *x, unsigned int icoord) const override;

// members
// mutable because ROOT::Math::IMultiGradFunction::DoDerivative is const
protected:
mutable std::vector<ROOT::Minuit2::DerivatorElement> _grad;
mutable std::vector<double> _grad_params;

private:
mutable ROOT::Minuit2::NumericalDerivator _gradf;
RooAbsReal *_funct;
mutable std::vector<bool> has_been_calculated;
mutable bool none_have_been_calculated = false;
};
#endif
59 changes: 38 additions & 21 deletions roofit/roofitcore/inc/RooMinimizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
* WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
* DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
* AL, Alfio Lazzaro, INFN Milan, alfio.lazzaro@mi.infn.it *
* PB, Patrick Bos, NL eScience Center, p.bos@esciencecenter.nl *
* *
* *
* Redistribution and use in source and binary forms, *
Expand All @@ -16,6 +17,8 @@
#ifndef ROO_MINIMIZER
#define ROO_MINIMIZER

#include <memory> // shared_ptr, unique_ptr

#include "TObject.h"
#include "TStopwatch.h"
#include <fstream>
Expand All @@ -24,8 +27,16 @@
#include <utility>
#include "TMatrixDSymfwd.h"

#include "Fit/Fitter.h"
#include "RooArgList.h" // cannot just use forward decl due to default argument in lastMinuitFit

#include "RooMinimizerFcn.h"
#include "RooGradMinimizerFcn.h"

#include "RooSentinel.h"
#include "RooMsgService.h"

#include "Fit/Fitter.h"
#include <stdexcept> // logic_error

class RooAbsReal ;
class RooFitResult ;
Expand All @@ -37,9 +48,11 @@ class RooPlot ;

class RooMinimizer : public TObject {
public:
enum class FcnMode { classic, gradient };

RooMinimizer(RooAbsReal& function) ;
virtual ~RooMinimizer() ;
explicit RooMinimizer(RooAbsReal &function, FcnMode fcnMode = FcnMode::classic);
static std::unique_ptr<RooMinimizer> create(RooAbsReal &function, FcnMode fcnMode = FcnMode::classic);
~RooMinimizer() override;

enum Strategy { Speed=0, Balance=1, Robustness=2 } ;
enum PrintLevel { None=-1, Reduced=0, Normal=1, ExtraForProblem=2, Maximum=3 } ;
Expand Down Expand Up @@ -91,7 +104,10 @@ class RooMinimizer : public TObject {

ROOT::Fit::Fitter* fitter() ;
const ROOT::Fit::Fitter* fitter() const ;


ROOT::Math::IMultiGenFunction* getFitterMultiGenFcn() const;
ROOT::Math::IMultiGenFunction* getMultiGenFcn() const;

protected:

friend class RooAbsPdf ;
Expand All @@ -100,37 +116,38 @@ class RooMinimizer : public TObject {
void profileStart() ;
void profileStop() ;

inline Int_t getNPar() const { return fitterFcn()->NDim() ; }
inline Int_t getNPar() const { return fitterFcn()->getNDim() ; }
inline std::ofstream* logfile() { return fitterFcn()->GetLogFile(); }
inline Double_t& maxFCN() { return fitterFcn()->GetMaxFCN() ; }

const RooMinimizerFcn* fitterFcn() const { return ( fitter()->GetFCN() ? ((RooMinimizerFcn*) fitter()->GetFCN()) : _fcn ) ; }
RooMinimizerFcn* fitterFcn() { return ( fitter()->GetFCN() ? ((RooMinimizerFcn*) fitter()->GetFCN()) : _fcn ) ; }

private:
const RooAbsMinimizerFcn *fitterFcn() const;
RooAbsMinimizerFcn *fitterFcn();

Int_t _printLevel ;
Int_t _status ;
Bool_t _profile ;
bool fitFcn() const;

Bool_t _verbose ;
TStopwatch _timer ;
TStopwatch _cumulTimer ;
Bool_t _profileStart ;
private:
Int_t _printLevel = 1;
Int_t _status = -99;
Bool_t _profile = kFALSE;

Bool_t _verbose = kFALSE;
TStopwatch _timer;
TStopwatch _cumulTimer;
Bool_t _profileStart = kFALSE;

TMatrixDSym* _extV ;
TMatrixDSym *_extV = 0;

RooMinimizerFcn *_fcn;
std::string _minimizerType;
RooAbsMinimizerFcn *_fcn;
std::string _minimizerType = "Minuit";
FcnMode _fcnMode;

static ROOT::Fit::Fitter *_theFitter ;

std::vector<std::pair<std::string,int> > _statusHistory ;

RooMinimizer(const RooMinimizer&) ;

ClassDef(RooMinimizer,0) // RooFit interface to ROOT::Fit::Fitter
ClassDefOverride(RooMinimizer,0) // RooFit interface to ROOT::Fit::Fitter
} ;


#endif
Loading