Skip to content

Commit a46ece5

Browse files
committed
Added MnUserParameterState stuff to NewMinuit interface
1 parent 7a5e09c commit a46ece5

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

optimizers/NewMinuit.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,27 @@ namespace optimizers {
7373
return m_strategy_value;
7474
}
7575

76+
77+
const ROOT::Minuit2::MnUserParameterState& userState() const;
7678
const ROOT::Minuit2::MinimumError& minuitError() const;
7779

80+
std::vector<std::vector<double> > userCovariance() const;
81+
const std::vector<double>& userGlobalCC() const;
82+
83+
// hessian (inverse of covariance matrix)
84+
std::vector<std::vector<double> > userHessian() const;
85+
86+
// covariance matrix status (0 = not valid, 1 approximate, 2, full but made pos def, 3 accurate and not pos def
87+
int userCovarianceStatus() const { return userState().CovarianceStatus(); }
88+
89+
bool userIsValid() const {return userState().IsValid();}
90+
bool userHasCovariance() const {return userState().HasCovariance();}
91+
bool userHasGlobalCC() const {return userState().HasGlobalCC();}
92+
double userFval() const {return userState().Fval();}
93+
double userEdm() const {return userState().Edm();}
94+
unsigned int userNFcn() const {return userState().NFcn();}
95+
96+
7897
double minuitDcovar() const {return minuitError().Dcovar();}
7998
bool minuitIsAccurate() const {return minuitError().IsAccurate();}
8099
bool minuitIsValid() const {return minuitError().IsValid();}

src/NewMinuit.cxx

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,12 @@ namespace optimizers {
301301
return grad;
302302
}
303303

304+
const ROOT::Minuit2::MnUserParameterState& NewMinuit::userState() const {
305+
static const ROOT::Minuit2::MnUserParameterState null_state;
306+
return m_min == 0 ? null_state : m_min->UserState();
307+
}
308+
309+
304310
const ROOT::Minuit2::MinimumError& NewMinuit::minuitError() const {
305311
static const ROOT::Minuit2::MinimumError null_error(1);
306312
return m_min == 0 ? null_error : m_min->Error();
@@ -331,6 +337,43 @@ namespace optimizers {
331337
return s;
332338
}
333339

340+
std::vector<std::vector<double> > NewMinuit::userCovariance() const {
341+
std::vector<std::vector<double> > cov;
342+
if ( m_min == 0 ) return cov;
343+
const ROOT::Minuit2::MnUserCovariance& userCov = m_min->UserState().Covariance();
344+
345+
for (unsigned int x = 0; x < userCov.Nrow(); ++x) {
346+
std::vector<double> vec;
347+
for (unsigned int y = 0; y < userCov.Nrow(); ++y) {
348+
vec.push_back(userCov(x,y));
349+
}
350+
cov.push_back(vec);
351+
}
352+
return cov;
353+
}
354+
355+
const std::vector<double>& NewMinuit::userGlobalCC() const {
356+
static const std::vector<double> null_globalcc;
357+
return m_min == 0 ? null_globalcc : m_min->UserState().GlobalCC().GlobalCC();
358+
}
359+
360+
361+
std::vector<std::vector<double> > NewMinuit::userHessian() const {
362+
std::vector<std::vector<double> > hesse;
363+
if ( m_min == 0 ) return hesse;
364+
ROOT::Minuit2::MnUserCovariance mn_hesse(m_min->UserState().Hessian());
365+
366+
for (unsigned int x = 0; x < mn_hesse.Nrow(); ++x) {
367+
std::vector<double> vec;
368+
for (unsigned int y = 0; y < mn_hesse.Nrow(); ++y) {
369+
vec.push_back(mn_hesse(x,y));
370+
}
371+
hesse.push_back(vec);
372+
}
373+
return hesse;
374+
}
375+
376+
334377
std::vector<std::vector<double> > NewMinuit::minuitInvHessian() const {
335378
std::vector<std::vector<double> > inv_hesse;
336379
if ( m_min == 0 ) return inv_hesse;
@@ -343,8 +386,7 @@ namespace optimizers {
343386
}
344387
inv_hesse.push_back(vec);
345388
}
346-
347-
389+
return inv_hesse;
348390
}
349391

350392
std::vector<std::vector<double> > NewMinuit::covarianceMatrix() const {

0 commit comments

Comments
 (0)