Skip to content

Commit 36493d2

Browse files
committed
[RF] Remove all code related to constant term optimization
This is one of the most complicated aspects of RooFit, which was deprecated in 6.40 and scheduled for removal in 6.42. It amounted to over 1 percent of the RooFitCore source code, and is now superseeded by the vectorized evaluation backend, which does the caching of vector buffers transparently in the RooFit evaluator.
1 parent 7e94aef commit 36493d2

57 files changed

Lines changed: 76 additions & 1623 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

roofit/histfactory/test/testHistFactory.cxx

Lines changed: 58 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -590,82 +590,67 @@ TEST_P(HFFixtureFit, Fit)
590590
auto mc = dynamic_cast<RooStats::ModelConfig *>(ws->obj("ModelConfig"));
591591
ASSERT_NE(mc, nullptr);
592592

593-
// This tests both correct pre-caching of constant terms and (if false) that all doEval() are correct.
594-
for (bool constTermOptimization : {true, false}) {
593+
std::unique_ptr<RooArgSet> pars(simPdf->getParameters(*data));
594+
// Kick parameters:
595+
for (auto par : *pars) {
596+
auto real = dynamic_cast<RooAbsRealLValue *>(par);
597+
if (real && !real->isConstant())
598+
real->setVal(real->getVal() * 0.95);
599+
}
600+
if (makeModelMode == MakeModelMode::StatSyst) {
601+
auto poi = dynamic_cast<RooRealVar *>(pars->find("SigXsecOverSM"));
602+
ASSERT_NE(poi, nullptr);
603+
poi->setVal(2.);
604+
poi->setConstant();
605+
}
595606

596-
// constTermOptimization makes only sense in the legacy backend
597-
if (constTermOptimization && evalBackend != RooFit::EvalBackend::Legacy()) {
598-
continue;
599-
}
600-
SCOPED_TRACE(constTermOptimization ? "const term optimisation" : "No const term optimisation");
601-
602-
// Stop if one of the previous runs had a failure to keep the terminal clean.
603-
if (HasFailure())
604-
break;
605-
606-
std::unique_ptr<RooArgSet> pars(simPdf->getParameters(*data));
607-
// Kick parameters:
608-
for (auto par : *pars) {
609-
auto real = dynamic_cast<RooAbsRealLValue *>(par);
610-
if (real && !real->isConstant())
611-
real->setVal(real->getVal() * 0.95);
612-
}
613-
if (makeModelMode == MakeModelMode::StatSyst) {
614-
auto poi = dynamic_cast<RooRealVar *>(pars->find("SigXsecOverSM"));
615-
ASSERT_NE(poi, nullptr);
616-
poi->setVal(2.);
617-
poi->setConstant();
607+
using namespace RooFit;
608+
std::unique_ptr<RooFitResult> fitResult{simPdf->fitTo(
609+
*data, evalBackend, GlobalObservables(*mc->GetGlobalObservables()), Save(), PrintLevel(verbose ? 1 : -1))};
610+
ASSERT_NE(fitResult, nullptr);
611+
if (verbose)
612+
fitResult->Print("v");
613+
EXPECT_EQ(fitResult->status(), 0);
614+
615+
auto checkParam = [&](const std::string &param, double target, double absPrecision = 1.e-2) {
616+
auto par = dynamic_cast<RooRealVar *>(fitResult->floatParsFinal().find(param.c_str()));
617+
if (!par) {
618+
// Parameter was constant in this fit
619+
par = dynamic_cast<RooRealVar *>(fitResult->constPars().find(param.c_str()));
620+
ASSERT_NE(par, nullptr) << param;
621+
EXPECT_DOUBLE_EQ(par->getVal(), target) << "Constant parameter " << param << " is off target.";
622+
} else {
623+
EXPECT_NEAR(par->getVal(), target, par->getError())
624+
<< "Parameter " << param << " close to target " << target << " within uncertainty";
625+
EXPECT_NEAR(par->getVal(), target, absPrecision) << "Parameter " << param << " close to target " << target;
618626
}
627+
};
619628

620-
using namespace RooFit;
621-
std::unique_ptr<RooFitResult> fitResult{simPdf->fitTo(*data, evalBackend, Optimize(constTermOptimization),
622-
GlobalObservables(*mc->GetGlobalObservables()), Save(),
623-
PrintLevel(verbose ? 1 : -1))};
624-
ASSERT_NE(fitResult, nullptr);
625-
if (verbose)
626-
fitResult->Print("v");
627-
EXPECT_EQ(fitResult->status(), 0);
628-
629-
auto checkParam = [&](const std::string &param, double target, double absPrecision = 1.e-2) {
630-
auto par = dynamic_cast<RooRealVar *>(fitResult->floatParsFinal().find(param.c_str()));
631-
if (!par) {
632-
// Parameter was constant in this fit
633-
par = dynamic_cast<RooRealVar *>(fitResult->constPars().find(param.c_str()));
634-
ASSERT_NE(par, nullptr) << param;
635-
EXPECT_DOUBLE_EQ(par->getVal(), target) << "Constant parameter " << param << " is off target.";
636-
} else {
637-
EXPECT_NEAR(par->getVal(), target, par->getError())
638-
<< "Parameter " << param << " close to target " << target << " within uncertainty";
639-
EXPECT_NEAR(par->getVal(), target, absPrecision) << "Parameter " << param << " close to target " << target;
640-
}
641-
};
642-
643-
if (makeModelMode == MakeModelMode::OverallSyst) {
644-
// Model is set up such that background scale factors should be close to 1, and signal == 2
645-
checkParam("SigXsecOverSM", 2.);
646-
checkParam("alpha_syst2", 0.);
647-
checkParam("alpha_syst3", 0.);
648-
checkParam("alpha_syst4", 0.);
649-
checkParam("gamma_stat_channel1_bin_0", 1.);
650-
checkParam("gamma_stat_channel1_bin_1", 1.);
651-
} else if (makeModelMode == MakeModelMode::HistoSyst) {
652-
// Model is set up with a -1 sigma pull on the signal shape parameter.
653-
checkParam("SigXsecOverSM", 2., 1.1E-1); // Higher tolerance: Expect a pull due to shape syst.
654-
checkParam("gamma_stat_channel1_bin_0", 1.);
655-
checkParam("gamma_stat_channel1_bin_1", 1.);
656-
checkParam("alpha_SignalShape", -0.9, 5.E-2); // Pull slightly lower than 1 because of constraint term
657-
} else if (makeModelMode == MakeModelMode::StatSyst) {
658-
// Model is set up with a -1 sigma pull on the signal shape parameter.
659-
checkParam("SigXsecOverSM", 2., 1.1E-1); // Higher tolerance: Expect a pull due to shape syst.
660-
checkParam("gamma_stat_channel1_bin_0", 1.09); // This should be pulled
661-
checkParam("gamma_stat_channel1_bin_1", 1.);
662-
} else if (makeModelMode == MakeModelMode::ShapeSyst) {
663-
// This should be pulled down
664-
checkParam("gamma_background1Shape_bin_0", 0.8866, 0.03);
665-
// This should be pulled up, but not so much because the free signal
666-
// strength will fit the excess in this bin.
667-
checkParam("gamma_background2Shape_bin_1", 1.0250, 0.03);
668-
}
629+
if (makeModelMode == MakeModelMode::OverallSyst) {
630+
// Model is set up such that background scale factors should be close to 1, and signal == 2
631+
checkParam("SigXsecOverSM", 2.);
632+
checkParam("alpha_syst2", 0.);
633+
checkParam("alpha_syst3", 0.);
634+
checkParam("alpha_syst4", 0.);
635+
checkParam("gamma_stat_channel1_bin_0", 1.);
636+
checkParam("gamma_stat_channel1_bin_1", 1.);
637+
} else if (makeModelMode == MakeModelMode::HistoSyst) {
638+
// Model is set up with a -1 sigma pull on the signal shape parameter.
639+
checkParam("SigXsecOverSM", 2., 1.1E-1); // Higher tolerance: Expect a pull due to shape syst.
640+
checkParam("gamma_stat_channel1_bin_0", 1.);
641+
checkParam("gamma_stat_channel1_bin_1", 1.);
642+
checkParam("alpha_SignalShape", -0.9, 5.E-2); // Pull slightly lower than 1 because of constraint term
643+
} else if (makeModelMode == MakeModelMode::StatSyst) {
644+
// Model is set up with a -1 sigma pull on the signal shape parameter.
645+
checkParam("SigXsecOverSM", 2., 1.1E-1); // Higher tolerance: Expect a pull due to shape syst.
646+
checkParam("gamma_stat_channel1_bin_0", 1.09); // This should be pulled
647+
checkParam("gamma_stat_channel1_bin_1", 1.);
648+
} else if (makeModelMode == MakeModelMode::ShapeSyst) {
649+
// This should be pulled down
650+
checkParam("gamma_background1Shape_bin_0", 0.8866, 0.03);
651+
// This should be pulled up, but not so much because the free signal
652+
// strength will fit the excess in this bin.
653+
checkParam("gamma_background2Shape_bin_1", 1.0250, 0.03);
669654
}
670655

671656
if (false) {

roofit/roofit/test/vectorisedPDFs/VectorisedPDFTests.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ std::unique_ptr<RooFitResult> PDFTest::runBatchFit(RooAbsPdf *pdf)
479479

480480
MyTimer batchTimer("Fitting batch mode " + _name);
481481
std::unique_ptr<RooFitResult> result{pdf->fitTo(*_dataFit, RooFit::EvalBackend::Cpu(), RooFit::SumW2Error(false),
482-
RooFit::Optimize(1), RooFit::PrintLevel(_printLevel), RooFit::Save(),
482+
RooFit::PrintLevel(_printLevel), RooFit::Save(),
483483
_multiProcess > 0 ? RooFit::NumCPU(_multiProcess) : RooCmdArg())};
484484
std::cout << batchTimer;
485485
EXPECT_NE(result, nullptr);

roofit/roofit/test/vectorisedPDFs/testGaussBinned.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ TEST_P(GaussBinnedFit, BatchFit)
8787
m.setVal(-1.);
8888
s.setVal(3.);
8989
MyTimer timer(evalBackend == EvalBackend::Value::Cpu ? "BatchBinned" : "ScalarBinned");
90-
gaus.fitTo(*dataHist, EvalBackend(evalBackend), PrintLevel(-1), Optimize(0));
90+
gaus.fitTo(*dataHist, EvalBackend(evalBackend), PrintLevel(-1));
9191
timer.interval();
9292
std::cout << timer << std::endl;
9393
EXPECT_NEAR(m.getVal(), 1., m.getError());

roofit/roofitcore/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,6 @@ ROOT_STANDARD_LIBRARY_PACKAGE(RooFitCore
436436
src/RooVectorDataStore.cxx
437437
src/RooWorkspace.cxx
438438
src/RooWrapperPdf.cxx
439-
src/TestStatistics/ConstantTermsOptimizer.cxx
440439
src/TestStatistics/LikelihoodGradientWrapper.cxx
441440
src/TestStatistics/LikelihoodSerial.cxx
442441
src/TestStatistics/LikelihoodWrapper.cxx

roofit/roofitcore/inc/RooAbsArg.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,6 @@ class RooAbsArg : public TNamed, public RooPrintable {
340340
bool findConstantNodes(const RooArgSet &observables, RooArgSet &cacheList);
341341
bool findConstantNodes(const RooArgSet &observables, RooArgSet &cacheList, RooLinkedList &processedNodes);
342342

343-
// constant term optimization
344-
virtual void constOptimizeTestStatistic(ConstOpCode opcode, bool doAlsoTrackingOpt = true);
345-
346343
virtual CacheMode canNodeBeCached() const { return Always; }
347344
virtual void setCacheAndTrackHints(RooArgSet & /*trackNodes*/) {};
348345

roofit/roofitcore/inc/RooAbsData.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,6 @@ class RooAbsData : public TNamed, public RooPrintable {
304304
double corrcov(const RooRealVar& x, const RooRealVar& y, const char* cutSpec, const char* cutRange, bool corr) const ;
305305
RooFit::OwningPtr<TMatrixDSym> corrcovMatrix(const RooArgList& vars, const char* cutSpec, const char* cutRange, bool corr) const ;
306306

307-
virtual void optimizeReadingWithCaching(RooAbsArg& arg, const RooArgSet& cacheList, const RooArgSet& keepObsList) ;
308-
bool allClientsCached(RooAbsArg*, const RooArgSet&) ;
309-
310307
struct PlotOpt {
311308
const char* cuts = "";
312309
Option_t* drawOptions = "P";
@@ -341,11 +338,6 @@ class RooAbsData : public TNamed, public RooPrintable {
341338
// for access into copied dataset:
342339
friend class RooFit::TestStatistics::RooAbsL;
343340

344-
virtual void cacheArgs(const RooAbsArg* owner, RooArgSet& varSet, const RooArgSet* nset=nullptr, bool skipZeroWeights=false) ;
345-
virtual void resetCache() ;
346-
virtual void setArgStatus(const RooArgSet& set, bool active) ;
347-
virtual void attachCache(const RooAbsArg* newOwner, const RooArgSet& cachedVars) ;
348-
349341
virtual std::unique_ptr<RooAbsData> reduceEng(const RooArgSet& varSubset, const RooFormulaVar* cutVar, const char* cutRange=nullptr,
350342
std::size_t nStart = 0, std::size_t = std::numeric_limits<std::size_t>::max()) const = 0 ;
351343

roofit/roofitcore/inc/RooAbsDataStore.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,15 +121,6 @@ class RooAbsDataStore : public TNamed, public RooPrintable {
121121
int defaultPrintContents(Option_t* /*opt*/) const override { return kName|kClassName|kArgs|kValue ; }
122122

123123

124-
// Constant term optimizer interface
125-
virtual void cacheArgs(const RooAbsArg* cacheOwner, RooArgSet& varSet, const RooArgSet* nset=nullptr, bool skipZeroWeights=false) = 0 ;
126-
virtual const RooAbsArg* cacheOwner() = 0 ;
127-
virtual void attachCache(const RooAbsArg* newOwner, const RooArgSet& cachedVars) = 0 ;
128-
virtual void setArgStatus(const RooArgSet& set, bool active) = 0 ;
129-
const RooArgSet& cachedVars() const { return _cachedVars ; }
130-
virtual void resetCache() = 0 ;
131-
virtual void recalculateCache(const RooArgSet* /*proj*/, Int_t /*firstEvent*/, Int_t /*lastEvent*/, Int_t /*stepSize*/, bool /* skipZeroWeights*/) {} ;
132-
133124
virtual void setDirtyProp(bool flag) { _doDirtyProp = flag ; }
134125
bool dirtyProp() const { return _doDirtyProp ; }
135126

@@ -142,8 +133,6 @@ class RooAbsDataStore : public TNamed, public RooPrintable {
142133
virtual void loadValues(const RooAbsDataStore *tds, const RooFormulaVar* select=nullptr, const char* rangeName=nullptr,
143134
std::size_t nStart=0, std::size_t nStop = std::numeric_limits<std::size_t>::max()) = 0 ;
144135

145-
virtual void forceCacheUpdate() {} ;
146-
147136
protected:
148137

149138
RooArgSet _vars;

roofit/roofitcore/inc/RooCompositeDataStore.h

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -89,20 +89,9 @@ class RooCompositeDataStore : public RooAbsDataStore {
8989
void attachBuffers(const RooArgSet& extObs) override ;
9090
void resetBuffers() override ;
9191

92-
// Constant term optimizer interface
93-
void cacheArgs(const RooAbsArg* owner, RooArgSet& varSet, const RooArgSet* nset=nullptr, bool skipZeroWeights=false) override ;
94-
const RooAbsArg* cacheOwner() override { return nullptr ; }
95-
void setArgStatus(const RooArgSet& set, bool active) override ;
96-
void resetCache() override ;
97-
98-
void recalculateCache(const RooArgSet* /*proj*/, Int_t /*firstEvent*/, Int_t /*lastEvent*/, Int_t /*stepSize*/, bool /*skipZeroWeights*/) override ;
99-
bool hasFilledCache() const override ;
100-
10192
void loadValues(const RooAbsDataStore *tds, const RooFormulaVar* select=nullptr, const char* rangeName=nullptr,
10293
std::size_t nStart=0, std::size_t nStop = std::numeric_limits<std::size_t>::max()) override;
10394

104-
void forceCacheUpdate() override ;
105-
10695
RooAbsData::RealSpans getBatches(std::size_t first, std::size_t len) const override {
10796
//TODO
10897
std::cerr << "This functionality is not yet implemented for composite data stores." << std::endl;
@@ -115,8 +104,6 @@ class RooCompositeDataStore : public RooAbsDataStore {
115104

116105
protected:
117106

118-
void attachCache(const RooAbsArg* newOwner, const RooArgSet& cachedVars) override ;
119-
120107
std::map<Int_t,RooAbsDataStore*> _dataMap ;
121108
RooCategory* _indexCat = nullptr;
122109
mutable RooAbsDataStore* _curStore = nullptr; ///<! Datastore associated with current event

roofit/roofitcore/inc/RooEvaluatorWrapper.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ class RooEvaluatorWrapper final : public RooAbsReal {
5858
_evaluator->print(os);
5959
}
6060

61-
/// The RooFit::Evaluator is dealing with constant terms itself.
62-
void constOptimizeTestStatistic(ConstOpCode /*opcode*/, bool /*doAlsoTrackingOpt*/) override {}
63-
6461
bool hasGradient() const override;
6562
bool hasHessian() const override;
6663

roofit/roofitcore/inc/RooFit/TestStatistics/LikelihoodWrapper.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ class LikelihoodWrapper {
9494
virtual void updateMinuitExternalParameterValues(const std::vector<double> &minuit_external_x);
9595

9696
// The following functions are necessary from MinuitFcnGrad to reach likelihood properties:
97-
void constOptimizeTestStatistic(RooAbsArg::ConstOpCode opcode, bool doAlsoTrackingOpt);
9897
double defaultErrorLevel() const;
9998
virtual std::string GetName() const;
10099
virtual std::string GetTitle() const;

0 commit comments

Comments
 (0)