49 MnPrint print(
"MnSeedGenerator");
52 const unsigned int n =
st.VariableParameters();
55 print.
Info(
"Computing seed using NumericalGradient calculator");
57 print.
Debug(
n,
"free parameters, FCN pointer", &
fcn);
61 for (
unsigned int i = 0; i <
n; i++)
62 x(i) =
st.IntParameters()[i];
69 auto timingScope = std::make_unique<ROOT::Math::Util::TimingScope>([&print](std::string
const &s) { print.
Info(s); },
70 "Evaluated function and gradient in");
77 if (
st.HasCovariance()) {
78 for (
unsigned int i = 0; i <
n; i++) {
79 mat(i, i) =
st.IntCovariance()(i, i) >
prec.Eps() ?
st.IntCovariance()(i, i)
82 for (
unsigned int j = i + 1;
j <
n;
j++)
83 mat(i,
j) =
st.IntCovariance()(i,
j);
87 for (
unsigned int i = 0; i <
n; i++)
98 if (!
st.HasCovariance()) {
101 print.
Debug(
"Negative G2 Found",
"\n point:",
x,
"\n grad :",
dgrad.Grad(),
"\n g2 :",
dgrad.G2());
105 print.
Info(
"Negative G2 found - new state:", state);
109 if (
stra.Strategy() == 2 && !
st.HasCovariance()) {
112 print.
Debug(
"calling MnHesse");
116 print.
Info(
"run Hesse - Initial seeding state:", tmp);
121 print.
Info(
"Initial state ",state);
130 MnPrint print(
"MnSeedGenerator");
137 if (!
gc.CanComputeG2()) {
138 print.
Info(
"Using analytical (external) gradient calculator but cannot compute G2 - use then numerical gradient for G2");
145 if (
gc.CanComputeHessian())
146 print.
Info(
"Computing seed using analytical (external) gradients and Hessian calculator");
148 print.
Info(
"Computing seed using analytical (external) gradients and G2 calculator");
153 unsigned int n =
st.VariableParameters();
172 print.
Error(
"Cannot compute G2 and Hessian");
177 for (
unsigned int i = 0; i <
n; i++)
181 print.
Debug(
"Computed analytical G2",
g2);
189 print.
Info(
"Use full Hessian as seed");
191 print.
Debug(
"computed Error matrix (H^-1)",
mat);
198 if (
st.HasCovariance()) {
199 print.
Info(
"Using existing covariance matrix");
200 for (
unsigned int i = 0; i <
n; i++) {
201 mat(i, i) =
st.IntCovariance()(i, i) >
prec.Eps() ?
st.IntCovariance()(i, i)
202 : grad.
G2()(i) >
prec.Eps() ? 1. / grad.
G2()(i)
204 for (
unsigned int j = i + 1;
j <
n;
j++)
205 mat(i,
j) =
st.IntCovariance()(i,
j);
209 for (
unsigned int i = 0; i <
n; i++) {
211 mat(i, i) = grad.
G2()(i) >
prec.Eps() ? 1. / grad.
G2()(i) : 1.0;
216 print.
Info(
"Computing seed using full Hessian");
223 print.
Error(
"Cannot compute seed because G2 is not computed");
227 if (!
st.HasCovariance()) {
240 print.
Info(
"Compute full Hessian: Initial seeding state is ",
tmpState);
244 print.
Info(
"Initial seeding state ",state);
265 std::pair<FunctionGradient, MnAlgebraicVector>
hgrd =
hgc.DeltaGradient(
pa,
dgrad);
266 for (
unsigned int i = 0; i <
n; i++) {
267 if (std::fabs(
hgrd.first.Grad()(i) -
grd.Grad()(i)) >
hgrd.second(i)) {
270 print.Warn(
"Gradient discrepancy of external Parameter too large:"
277 print.Error(
"Minuit does not accept user specified Gradient. To force acceptance, override 'virtual bool "
278 "CheckGradient() const' of FCNGradientBase.h in the derived class.");
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void gc
const MnAlgebraicVector & Grad() const
const MnAlgebraicVector & G2() const
interface class for gradient calculators
HessianGradientCalculator: class to calculate Gradient for Hessian.
Class describing a symmetric matrix of size n.
MinimumError keeps the inv.
static MnAlgebraicSymMatrix InvertMatrix(const MnAlgebraicSymMatrix &matrix, int &ifail)
MinimumState keeps the information (position, Gradient, 2nd deriv, etc) after one minimization step (...
Wrapper class to FCNBase interface used internally by Minuit.
API class for calculating the numerical covariance matrix (== 2x Inverse Hessian == 2x Inverse 2nd de...
Sets the relative floating point (double) arithmetic precision.
void Debug(const Ts &... args)
void Error(const Ts &... args)
void Info(const Ts &... args)
MinimumSeed CallWithAnalyticalGradientCalculator(const MnFcn &, const AnalyticalGradientCalculator &, const MnUserParameterState &, const MnStrategy &) const
MinimumSeed operator()(const MnFcn &, const GradientCalculator &, const MnUserParameterState &, const MnStrategy &) const override
API class for defining four levels of strategies: low (0), medium (1), high (2), very high (>=3); act...
class which holds the external user and/or internal Minuit representation of the parameters and error...
In case that one of the components of the second derivative g2 calculated by the numerical Gradient c...
class performing the numerical gradient calculation
double Estimate(const FunctionGradient &, const MinimumError &) const
Namespace for new ROOT classes and functions.