Skip to content

Commit 2d58f58

Browse files
authored
Merge pull request #7 from fermi-lat/optimizers-1
Optimizers 1
2 parents 6e5ff5d + a46ece5 commit 2d58f58

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed

optimizers/NewMinuit.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "Minuit2/MnStrategy.h"
1616
#include "Minuit2/MnUserParameterState.h"
1717
#include "Minuit2/FunctionMinimum.h"
18+
#include "Minuit2/MinimumError.h"
1819

1920
namespace optimizers {
2021

@@ -72,9 +73,43 @@ namespace optimizers {
7273
return m_strategy_value;
7374
}
7475

76+
77+
const ROOT::Minuit2::MnUserParameterState& userState() const;
78+
const ROOT::Minuit2::MinimumError& minuitError() const;
79+
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+
97+
double minuitDcovar() const {return minuitError().Dcovar();}
98+
bool minuitIsAccurate() const {return minuitError().IsAccurate();}
99+
bool minuitIsValid() const {return minuitError().IsValid();}
100+
bool minuitIsPosDef() const {return minuitError().IsPosDef();}
101+
bool minuitIsMadePosDef() const {return minuitError().IsMadePosDef();}
102+
bool minuitHesseFailed() const {return minuitError().HesseFailed();}
103+
bool minuitInvertFailed() const {return minuitError().InvertFailed();}
104+
bool minuitIsAvailable() const {return minuitError().IsAvailable();}
105+
106+
std::vector<std::vector<double> > minuitInvHessian() const;
107+
75108
double getDistance(void) const {return m_distance;};
76109
virtual const std::vector<double> & getUncertainty(bool useBase = false);
77110
virtual std::vector<std::vector<double> > covarianceMatrix() const;
111+
112+
78113
virtual std::ostream& put (std::ostream& s) const;
79114
std::pair<double,double> Minos(unsigned int n, double level=1., bool numericDeriv=false);
80115

src/NewMinuit.cxx

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "Minuit2/FunctionMinimum.h"
1919
#include "Minuit2/MnHesse.h"
2020
#include "Minuit2/MnPrint.h"
21+
#include "Minuit2/MnMatrix.h"
2122
#include "optimizers/Exception.h"
2223
#include "optimizers/OutOfBounds.h"
2324
#include "StMnMinos.h"
@@ -300,6 +301,18 @@ namespace optimizers {
300301
return grad;
301302
}
302303

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+
310+
const ROOT::Minuit2::MinimumError& NewMinuit::minuitError() const {
311+
static const ROOT::Minuit2::MinimumError null_error(1);
312+
return m_min == 0 ? null_error : m_min->Error();
313+
}
314+
315+
303316
// Get the uncertainty values from covariance matrix
304317
const std::vector<double> & NewMinuit::getUncertainty(bool useBase) {
305318
std::vector<double> parValues;
@@ -324,6 +337,58 @@ namespace optimizers {
324337
return s;
325338
}
326339

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+
377+
std::vector<std::vector<double> > NewMinuit::minuitInvHessian() const {
378+
std::vector<std::vector<double> > inv_hesse;
379+
if ( m_min == 0 ) return inv_hesse;
380+
const ROOT::Minuit2::MnAlgebraicSymMatrix& inv_mat = m_min->Error().InvHessian();
381+
382+
for (unsigned int x = 0; x < inv_mat.Nrow(); ++x) {
383+
std::vector<double> vec;
384+
for (unsigned int y = 0; y < inv_mat.Nrow(); ++y) {
385+
vec.push_back(inv_mat(x,y));
386+
}
387+
inv_hesse.push_back(vec);
388+
}
389+
return inv_hesse;
390+
}
391+
327392
std::vector<std::vector<double> > NewMinuit::covarianceMatrix() const {
328393
std::vector<double> parValues;
329394
m_stat->getFreeParamValues(parValues);

0 commit comments

Comments
 (0)