Skip to content

Commit 77951c7

Browse files
committed
[Minuit2] Only compute global correlation matrix when needed
For many parameters, the global correlation matrix can be very expensive to compute. We therefore don't want to calculate it unconditionally, but only when the user actually requests them by calling `Minimizer::GlobalCC()`.
1 parent 0213076 commit 77951c7

File tree

4 files changed

+19
-19
lines changed

4 files changed

+19
-19
lines changed

math/minuit2/inc/Minuit2/MnUserParameterState.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class MnUserParameterState {
6464
// user external representation
6565
const MnUserParameters &Parameters() const { return fParameters; }
6666
const MnUserCovariance &Covariance() const { return fCovariance; }
67-
const MnGlobalCorrelationCoeff &GlobalCC() const { return fGlobalCC; }
67+
MnGlobalCorrelationCoeff GlobalCC() const;
6868

6969
// hessian (inverse of covariance matrix)
7070
MnUserCovariance Hessian() const;
@@ -161,7 +161,6 @@ class MnUserParameterState {
161161

162162
MnUserParameters fParameters;
163163
MnUserCovariance fCovariance;
164-
MnGlobalCorrelationCoeff fGlobalCC;
165164

166165
std::vector<double> fIntParameters;
167166
MnUserCovariance fIntCovariance;

math/minuit2/src/Minuit2Minimizer.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,7 @@ std::vector<double> Minuit2Minimizer::GlobalCC() const
856856
// is most strongly correlated with i.
857857

858858
std::vector<double> out;
859-
auto const &globalCC = fState.GlobalCC();
859+
MnGlobalCorrelationCoeff globalCC = fState.GlobalCC();
860860
// no info available when minimization has failed or has some problems
861861
if (!globalCC.IsValid())
862862
return out;

math/minuit2/src/MnUserParameterState.cxx

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ MnUserParameterState::MnUserParameterState(const MinimumState &st, double up, co
148148
fIntCovariance =
149149
MnUserCovariance({st.Error().InvHessian().Data(), st.Error().InvHessian().size()}, st.Error().InvHessian().Nrow());
150150
fCovariance.Scale(2. * up);
151-
fGlobalCC = MnGlobalCorrelationCoeff(st.Error().InvHessian());
152151

153152
assert(fCovariance.Nrow() == VariableParameters());
154153

@@ -219,7 +218,6 @@ void MnUserParameterState::Add(const std::string &name, double val, double err)
219218
if (fParameters.Add(name, val, err)) {
220219
fIntParameters.push_back(val);
221220
fCovarianceValid = false;
222-
fGlobalCC = MnGlobalCorrelationCoeff{}; // invalidate
223221
fValid = true;
224222
} else {
225223
// redefine an existing parameter
@@ -244,7 +242,6 @@ void MnUserParameterState::Add(const std::string &name, double val, double err,
244242
if (fParameters.Add(name, val, err, low, up)) {
245243
fCovarianceValid = false;
246244
fIntParameters.push_back(Ext2int(Index(name), val));
247-
fGlobalCC = MnGlobalCorrelationCoeff{}; // invalidate
248245
fValid = true;
249246
} else { // Parameter already exist - just set values
250247
int i = Index(name);
@@ -317,7 +314,6 @@ void MnUserParameterState::Fix(unsigned int e)
317314
fIntParameters.erase(fIntParameters.begin() + i, fIntParameters.begin() + i + 1);
318315
}
319316
fParameters.Fix(e);
320-
fGlobalCC = MnGlobalCorrelationCoeff{}; // invalidate
321317
}
322318

323319
void MnUserParameterState::Release(unsigned int e)
@@ -328,7 +324,6 @@ void MnUserParameterState::Release(unsigned int e)
328324
return;
329325
fParameters.Release(e);
330326
fCovarianceValid = false;
331-
fGlobalCC = MnGlobalCorrelationCoeff{}; // invalidate
332327
unsigned int i = IntOfExt(e);
333328
if (Parameter(e).HasLimits())
334329
fIntParameters.insert(fIntParameters.begin() + i, Ext2int(e, Parameter(e).Value()));
@@ -360,7 +355,6 @@ void MnUserParameterState::SetLimits(unsigned int e, double low, double up)
360355
// set limits for parameter e (external index)
361356
fParameters.SetLimits(e, low, up);
362357
fCovarianceValid = false;
363-
fGlobalCC = MnGlobalCorrelationCoeff{}; // invalidate
364358
if (!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
365359
unsigned int i = IntOfExt(e);
366360
if (low < fIntParameters[i] && fIntParameters[i] < up)
@@ -377,7 +371,6 @@ void MnUserParameterState::SetUpperLimit(unsigned int e, double up)
377371
// set upper limit for parameter e (external index)
378372
fParameters.SetUpperLimit(e, up);
379373
fCovarianceValid = false;
380-
fGlobalCC = MnGlobalCorrelationCoeff{}; // invalidate
381374
if (!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
382375
unsigned int i = IntOfExt(e);
383376
if (fIntParameters[i] < up)
@@ -392,7 +385,6 @@ void MnUserParameterState::SetLowerLimit(unsigned int e, double low)
392385
// set lower limit for parameter e (external index)
393386
fParameters.SetLowerLimit(e, low);
394387
fCovarianceValid = false;
395-
fGlobalCC = MnGlobalCorrelationCoeff{}; // invalidate
396388
if (!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
397389
unsigned int i = IntOfExt(e);
398390
if (low < fIntParameters[i])
@@ -407,7 +399,6 @@ void MnUserParameterState::RemoveLimits(unsigned int e)
407399
// remove limit for parameter e (external index)
408400
fParameters.RemoveLimits(e);
409401
fCovarianceValid = false;
410-
fGlobalCC = MnGlobalCorrelationCoeff{}; // invalidate
411402
if (!Parameter(e).IsFixed() && !Parameter(e).IsConst())
412403
fIntParameters[IntOfExt(e)] = Value(e);
413404
}
@@ -531,6 +522,21 @@ void MnUserParameterState::SetPrecision(double eps)
531522
fParameters.SetPrecision(eps);
532523
}
533524

525+
MnGlobalCorrelationCoeff MnUserParameterState::GlobalCC() const
526+
{
527+
if (!fCovarianceValid) {
528+
return MnGlobalCorrelationCoeff{}; // invalidate
529+
}
530+
int n = fIntCovariance.Nrow();
531+
MnAlgebraicSymMatrix invHessian{static_cast<unsigned int>(n)};
532+
for (int i = 0; i < n; ++i) {
533+
for (int j = 0; j <= i; ++j) {
534+
invHessian(i, j) = fIntCovariance(i, j);
535+
}
536+
}
537+
return MnGlobalCorrelationCoeff{invHessian};
538+
}
539+
534540
} // namespace Minuit2
535541

536542
} // namespace ROOT

roofit/roofitcore/src/RooMinimizer.cxx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -613,11 +613,11 @@ double correlation(std::vector<double> const &covMat, unsigned int i, unsigned i
613613
void RooMinimizer::fillCorrMatrix(RooFitResult &fitRes)
614614
{
615615
const std::size_t nParams = _fcn->getNDim();
616-
std::vector<double> globalCC;
617616
TMatrixDSym corrs(nParams);
618617
TMatrixDSym covs(nParams);
618+
std::vector<double> globalCC = _minimizer->GlobalCC();
619+
globalCC.resize(nParams); // pad with zeros
619620
for (std::size_t ic = 0; ic < nParams; ic++) {
620-
globalCC.push_back(_result->fGlobalCC[ic]);
621621
for (std::size_t ii = 0; ii < nParams; ii++) {
622622
corrs(ic, ii) = correlation(_result->fCovMatrix, ic, ii);
623623
covs(ic, ii) = covMatrix(_result->fCovMatrix, ic, ii);
@@ -1256,7 +1256,6 @@ void RooMinimizer::fillResult(bool isValid)
12561256
// if minimizer provides error provides also error matrix
12571257
// clear in case of re-filling an existing result
12581258
_result->fCovMatrix.clear();
1259-
_result->fGlobalCC.clear();
12601259

12611260
if (min.Errors() != nullptr) {
12621261
updateErrors();
@@ -1312,10 +1311,6 @@ void RooMinimizer::updateErrors()
13121311
}
13131312
}
13141313
// minos errors are set separately when calling Fitter::CalculateMinosErrors()
1315-
1316-
// update global CC
1317-
_result->fGlobalCC = min.GlobalCC();
1318-
_result->fGlobalCC.resize(npar); // pad with zeros
13191314
}
13201315

13211316
double RooMinimizer::FitResult::lowerError(unsigned int i) const

0 commit comments

Comments
 (0)