From 7a5e09c8bc3cad7f94d7379df793af306df7c4d9 Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Thu, 9 Jan 2020 16:42:01 -0800 Subject: [PATCH 1/2] Added access to MinuitError stuff to NewMinuit --- optimizers/NewMinuit.h | 16 ++++++++++++++++ src/NewMinuit.cxx | 23 +++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/optimizers/NewMinuit.h b/optimizers/NewMinuit.h index e363c9a..7589093 100644 --- a/optimizers/NewMinuit.h +++ b/optimizers/NewMinuit.h @@ -15,6 +15,7 @@ #include "Minuit2/MnStrategy.h" #include "Minuit2/MnUserParameterState.h" #include "Minuit2/FunctionMinimum.h" +#include "Minuit2/MinimumError.h" namespace optimizers { @@ -72,9 +73,24 @@ namespace optimizers { return m_strategy_value; } + const ROOT::Minuit2::MinimumError& minuitError() const; + + double minuitDcovar() const {return minuitError().Dcovar();} + bool minuitIsAccurate() const {return minuitError().IsAccurate();} + bool minuitIsValid() const {return minuitError().IsValid();} + bool minuitIsPosDef() const {return minuitError().IsPosDef();} + bool minuitIsMadePosDef() const {return minuitError().IsMadePosDef();} + bool minuitHesseFailed() const {return minuitError().HesseFailed();} + bool minuitInvertFailed() const {return minuitError().InvertFailed();} + bool minuitIsAvailable() const {return minuitError().IsAvailable();} + + std::vector > minuitInvHessian() const; + double getDistance(void) const {return m_distance;}; virtual const std::vector & getUncertainty(bool useBase = false); virtual std::vector > covarianceMatrix() const; + + virtual std::ostream& put (std::ostream& s) const; std::pair Minos(unsigned int n, double level=1., bool numericDeriv=false); diff --git a/src/NewMinuit.cxx b/src/NewMinuit.cxx index 3b26ff1..a813a7f 100644 --- a/src/NewMinuit.cxx +++ b/src/NewMinuit.cxx @@ -18,6 +18,7 @@ #include "Minuit2/FunctionMinimum.h" #include "Minuit2/MnHesse.h" #include "Minuit2/MnPrint.h" +#include "Minuit2/MnMatrix.h" #include "optimizers/Exception.h" #include "optimizers/OutOfBounds.h" #include "StMnMinos.h" @@ -300,6 +301,12 @@ namespace optimizers { return grad; } + const ROOT::Minuit2::MinimumError& NewMinuit::minuitError() const { + static const ROOT::Minuit2::MinimumError null_error(1); + return m_min == 0 ? null_error : m_min->Error(); + } + + // Get the uncertainty values from covariance matrix const std::vector & NewMinuit::getUncertainty(bool useBase) { std::vector parValues; @@ -322,6 +329,22 @@ namespace optimizers { std::ostream& NewMinuit::put (std::ostream& s) const { s << m_min->UserState(); return s; + } + + std::vector > NewMinuit::minuitInvHessian() const { + std::vector > inv_hesse; + if ( m_min == 0 ) return inv_hesse; + const ROOT::Minuit2::MnAlgebraicSymMatrix& inv_mat = m_min->Error().InvHessian(); + + for (unsigned int x = 0; x < inv_mat.Nrow(); ++x) { + std::vector vec; + for (unsigned int y = 0; y < inv_mat.Nrow(); ++y) { + vec.push_back(inv_mat(x,y)); + } + inv_hesse.push_back(vec); + } + + } std::vector > NewMinuit::covarianceMatrix() const { From a46ece5762adba7c15b1fcfa6246fc54b144e4de Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Wed, 15 Jan 2020 14:13:46 -0800 Subject: [PATCH 2/2] Added MnUserParameterState stuff to NewMinuit interface --- optimizers/NewMinuit.h | 19 +++++++++++++++++ src/NewMinuit.cxx | 46 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/optimizers/NewMinuit.h b/optimizers/NewMinuit.h index 7589093..d989bb6 100644 --- a/optimizers/NewMinuit.h +++ b/optimizers/NewMinuit.h @@ -73,8 +73,27 @@ namespace optimizers { return m_strategy_value; } + + const ROOT::Minuit2::MnUserParameterState& userState() const; const ROOT::Minuit2::MinimumError& minuitError() const; + std::vector > userCovariance() const; + const std::vector& userGlobalCC() const; + + // hessian (inverse of covariance matrix) + std::vector > userHessian() const; + + // covariance matrix status (0 = not valid, 1 approximate, 2, full but made pos def, 3 accurate and not pos def + int userCovarianceStatus() const { return userState().CovarianceStatus(); } + + bool userIsValid() const {return userState().IsValid();} + bool userHasCovariance() const {return userState().HasCovariance();} + bool userHasGlobalCC() const {return userState().HasGlobalCC();} + double userFval() const {return userState().Fval();} + double userEdm() const {return userState().Edm();} + unsigned int userNFcn() const {return userState().NFcn();} + + double minuitDcovar() const {return minuitError().Dcovar();} bool minuitIsAccurate() const {return minuitError().IsAccurate();} bool minuitIsValid() const {return minuitError().IsValid();} diff --git a/src/NewMinuit.cxx b/src/NewMinuit.cxx index a813a7f..5f1072f 100644 --- a/src/NewMinuit.cxx +++ b/src/NewMinuit.cxx @@ -301,6 +301,12 @@ namespace optimizers { return grad; } + const ROOT::Minuit2::MnUserParameterState& NewMinuit::userState() const { + static const ROOT::Minuit2::MnUserParameterState null_state; + return m_min == 0 ? null_state : m_min->UserState(); + } + + const ROOT::Minuit2::MinimumError& NewMinuit::minuitError() const { static const ROOT::Minuit2::MinimumError null_error(1); return m_min == 0 ? null_error : m_min->Error(); @@ -331,6 +337,43 @@ namespace optimizers { return s; } + std::vector > NewMinuit::userCovariance() const { + std::vector > cov; + if ( m_min == 0 ) return cov; + const ROOT::Minuit2::MnUserCovariance& userCov = m_min->UserState().Covariance(); + + for (unsigned int x = 0; x < userCov.Nrow(); ++x) { + std::vector vec; + for (unsigned int y = 0; y < userCov.Nrow(); ++y) { + vec.push_back(userCov(x,y)); + } + cov.push_back(vec); + } + return cov; + } + + const std::vector& NewMinuit::userGlobalCC() const { + static const std::vector null_globalcc; + return m_min == 0 ? null_globalcc : m_min->UserState().GlobalCC().GlobalCC(); + } + + + std::vector > NewMinuit::userHessian() const { + std::vector > hesse; + if ( m_min == 0 ) return hesse; + ROOT::Minuit2::MnUserCovariance mn_hesse(m_min->UserState().Hessian()); + + for (unsigned int x = 0; x < mn_hesse.Nrow(); ++x) { + std::vector vec; + for (unsigned int y = 0; y < mn_hesse.Nrow(); ++y) { + vec.push_back(mn_hesse(x,y)); + } + hesse.push_back(vec); + } + return hesse; + } + + std::vector > NewMinuit::minuitInvHessian() const { std::vector > inv_hesse; if ( m_min == 0 ) return inv_hesse; @@ -343,8 +386,7 @@ namespace optimizers { } inv_hesse.push_back(vec); } - - + return inv_hesse; } std::vector > NewMinuit::covarianceMatrix() const {