Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
MnUserParameterState.cxx
Go to the documentation of this file.
1// @(#)root/minuit2:$Id$
2// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei 2003-2005
3
4/**********************************************************************
5 * *
6 * Copyright (c) 2005 LCG ROOT Math team, CERN/PH-SFT *
7 * *
8 **********************************************************************/
9
13#include "Minuit2/MnPrint.h"
14
15namespace ROOT {
16
17namespace Minuit2 {
18
19//
20// construct from user parameters (before minimization)
21//
22MnUserParameterState::MnUserParameterState(std::span<const double> par, std::span<const double> err)
23 : fValid(true), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
24 fParameters(MnUserParameters(par, err)),
25 fIntParameters(par.begin(), par.end())
26{
27}
28
30 : fValid(true), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
31 fParameters(par)
32{
33 // construct from user parameters (before minimization)
34
35 for (auto const &ipar : MinuitParameters()) {
36 if (ipar.IsConst() || ipar.IsFixed())
37 continue;
38 if (ipar.HasLimits())
39 fIntParameters.push_back(Ext2int(ipar.Number(), ipar.Value()));
40 else
41 fIntParameters.push_back(ipar.Value());
42 }
43}
44
45//
46// construct from user parameters + errors (before minimization)
47//
48MnUserParameterState::MnUserParameterState(std::span<const double> par, std::span<const double> cov,
49 unsigned int nrow)
50 : fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
51 fCovariance(MnUserCovariance(cov, nrow)),
52 fIntParameters(par.begin(), par.end()), fIntCovariance(MnUserCovariance(cov, nrow))
53{
54 // construct from user parameters + errors (before minimization) using std::vector for parameter error and // an
55 // std::vector of size n*(n+1)/2 for the covariance matrix and n (rank of cov matrix)
56
57 std::vector<double> err;
58 err.reserve(par.size());
59 for (unsigned int i = 0; i < par.size(); i++) {
60 assert(fCovariance(i, i) > 0.);
61 err.push_back(std::sqrt(fCovariance(i, i)));
62 }
63 fParameters = MnUserParameters(par, err);
64 assert(fCovariance.Nrow() == VariableParameters());
65}
66
67MnUserParameterState::MnUserParameterState(std::span<const double> par, const MnUserCovariance &cov)
68 : fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
69 fCovariance(cov), fIntParameters(par.begin(), par.end()),
70 fIntCovariance(cov)
71{
72 // construct from user parameters + errors (before minimization) using std::vector (params) and MnUserCovariance
73 // class
74
75 std::vector<double> err;
76 err.reserve(par.size());
77 for (unsigned int i = 0; i < par.size(); i++) {
78 assert(fCovariance(i, i) > 0.);
79 err.push_back(std::sqrt(fCovariance(i, i)));
80 }
81 fParameters = MnUserParameters(par, err);
82 assert(fCovariance.Nrow() == VariableParameters());
83}
84
86 : fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0),
87 fParameters(par), fCovariance(cov),
88 fIntCovariance(cov)
89{
90 // construct from user parameters + errors (before minimization) using
91 // MnUserParameters and MnUserCovariance objects
92
94 for (auto const &ipar : MinuitParameters()) {
95 if (ipar.IsConst() || ipar.IsFixed())
96 continue;
97 if (ipar.HasLimits())
98 fIntParameters.push_back(Ext2int(ipar.Number(), ipar.Value()));
99 else
100 fIntParameters.push_back(ipar.Value());
101 }
102 assert(fCovariance.Nrow() == VariableParameters());
103 //
104 // need to Fix that in case of limited parameters
105 // fIntCovariance = MnUserCovariance();
106 //
107}
108
109//
110//
112 : fValid(st.IsValid()), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1), fFVal(st.Fval()), fEDM(st.Edm()),
113 fNFcn(st.NFcn())
114{
115 //
116 // construct from internal parameters (after minimization)
117 //
118 // std::cout << "build a MnUserParameterState after minimization.." << std::endl;
119
120 for (auto const &ipar : trafo.Parameters()) {
121 if (ipar.IsConst()) {
122 Add(ipar.GetName(), ipar.Value());
123 } else if (ipar.IsFixed()) {
124 Add(ipar.GetName(), ipar.Value(), ipar.Error());
125 if (ipar.HasLimits()) {
126 if (ipar.HasLowerLimit() && ipar.HasUpperLimit())
127 SetLimits(ipar.GetName(), ipar.LowerLimit(), ipar.UpperLimit());
128 else if (ipar.HasLowerLimit() && !ipar.HasUpperLimit())
129 SetLowerLimit(ipar.GetName(), ipar.LowerLimit());
130 else
131 SetUpperLimit(ipar.GetName(), ipar.UpperLimit());
132 }
133 Fix(ipar.GetName());
134 } else if (ipar.HasLimits()) {
135 unsigned int i = trafo.IntOfExt(ipar.Number());
136 double err =
137 st.Error().IsValid() ? std::sqrt(2. * up * st.Error().InvHessian()(i, i)) : st.Parameters().Dirin()(i);
138 Add(ipar.GetName(), trafo.Int2ext(i, st.Vec()(i)), trafo.Int2extError(i, st.Vec()(i), err));
139 if (ipar.HasLowerLimit() && ipar.HasUpperLimit())
140 SetLimits(ipar.GetName(), ipar.LowerLimit(), ipar.UpperLimit());
141 else if (ipar.HasLowerLimit() && !ipar.HasUpperLimit())
142 SetLowerLimit(ipar.GetName(), ipar.LowerLimit());
143 else
144 SetUpperLimit(ipar.GetName(), ipar.UpperLimit());
145 } else {
146 unsigned int i = trafo.IntOfExt(ipar.Number());
147 double err =
148 st.Error().IsValid() ? std::sqrt(2. * up * st.Error().InvHessian()(i, i)) : st.Parameters().Dirin()(i);
149 Add(ipar.GetName(), st.Vec()(i), err);
150 }
151 }
152
153 // need to be set afterwards because becore the ::Add method set fCovarianceValid to false
155
156 fCovStatus = -1; // when not available
157 // if (st.Error().HesseFailed() || st.Error().InvertFailed() ) fCovStatus = -1;
158 // when available
159 if (st.Error().IsAvailable())
160 fCovStatus = 0;
161
162 if (fCovarianceValid) {
163 fCovariance = trafo.Int2extCovariance(st.Vec(), st.Error().InvHessian());
165 MnUserCovariance({st.Error().InvHessian().Data(), st.Error().InvHessian().size()}, st.Error().InvHessian().Nrow());
166 fCovariance.Scale(2. * up);
169
170 assert(fCovariance.Nrow() == VariableParameters());
171
172 if (!st.Error().IsNotPosDef())
173 fCovStatus = 1; // when is valid and not NotPosDef
174 }
175 if (st.Error().IsMadePosDef())
176 fCovStatus = 2;
177 if (st.Error().IsAccurate())
178 fCovStatus = 3;
179
180}
181
183{
184 // invert covariance matrix and return Hessian
185 // need to copy in a MnSymMatrix
186 MnPrint print("MnUserParameterState::Hessian");
187
189 std::copy(fCovariance.Data().begin(), fCovariance.Data().end(), mat.Data());
190 int ifail = Invert(mat);
191 if (ifail != 0) {
192 print.Warn("Inversion failed; return diagonal matrix");
193
195 for (unsigned int i = 0; i < fCovariance.Nrow(); i++) {
196 tmp(i, i) = 1. / fCovariance(i, i);
197 }
198 return tmp;
199 }
200
201 MnUserCovariance hessian(mat.Data(), fCovariance.Nrow());
202 return hessian;
203}
204
205// facade: forward interface of MnUserParameters and MnUserTransformation
206// via MnUserParameterState
207
208const std::vector<MinuitParameter> &MnUserParameterState::MinuitParameters() const
209{
210 // access to parameters (row-wise)
211 return fParameters.Parameters();
212}
213
214std::vector<double> MnUserParameterState::Params() const
215{
216 // access to parameters in column-wise representation
217 return fParameters.Params();
218}
219std::vector<double> MnUserParameterState::Errors() const
220{
221 // access to errors in column-wise representation
222 return fParameters.Errors();
223}
224
226{
227 // access to single Parameter i
228 return fParameters.Parameter(i);
229}
230
231void MnUserParameterState::Add(const std::string &name, double val, double err)
232{
233 MnPrint print("MnUserParameterState::Add");
234
235 // add free Parameter
236 if (fParameters.Add(name, val, err)) {
237 fIntParameters.push_back(val);
238 fCovarianceValid = false;
239 fGCCValid = false;
240 fValid = true;
241 } else {
242 // redefine an existing parameter
243 int i = Index(name);
244 SetValue(i, val);
245 if (Parameter(i).IsConst()) {
246 print.Warn("Cannot modify status of constant parameter", name);
247 return;
248 }
249 SetError(i, err);
250 // release if it was fixed
251 if (Parameter(i).IsFixed())
252 Release(i);
253 }
254}
255
256void MnUserParameterState::Add(const std::string &name, double val, double err, double low, double up)
257{
258 MnPrint print("MnUserParameterState::Add");
259
260 // add limited Parameter
261 if (fParameters.Add(name, val, err, low, up)) {
262 fCovarianceValid = false;
263 fIntParameters.push_back(Ext2int(Index(name), val));
264 fGCCValid = false;
265 fValid = true;
266 } else { // Parameter already exist - just set values
267 int i = Index(name);
268 SetValue(i, val);
269 if (Parameter(i).IsConst()) {
270 print.Warn("Cannot modify status of constant parameter", name);
271 return;
272 }
273 SetError(i, err);
274 SetLimits(i, low, up);
275 // release if it was fixed
276 if (Parameter(i).IsFixed())
277 Release(i);
278 }
279}
280
281void MnUserParameterState::Add(const std::string &name, double val)
282{
283 // add const Parameter
284 if (fParameters.Add(name, val))
285 fValid = true;
286 else
287 SetValue(name, val);
288}
289
290// interaction via external number of Parameter
291
292void MnUserParameterState::Fix(unsigned int e)
293{
294 // fix parameter e (external index)
295 if (!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
296 unsigned int i = IntOfExt(e);
297 if (fCovarianceValid) {
298 // when covariance is valid remove fixed parameter row/column in covariance matrix
299 // use squeeze to remove first from Hessian and obtain then new covariance
302 }
303 fIntParameters.erase(fIntParameters.begin() + i, fIntParameters.begin() + i + 1);
304 }
306 fGCCValid = false;
307}
308
310{
311 // release parameter e (external index)
312 // no-op if parameter is const or if it is not fixed
313 if (Parameter(e).IsConst() || !Parameter(e).IsFixed())
314 return;
316 fCovarianceValid = false;
317 fGCCValid = false;
318 unsigned int i = IntOfExt(e);
319 if (Parameter(e).HasLimits())
320 fIntParameters.insert(fIntParameters.begin() + i, Ext2int(e, Parameter(e).Value()));
321 else
322 fIntParameters.insert(fIntParameters.begin() + i, Parameter(e).Value());
323}
324
325void MnUserParameterState::SetValue(unsigned int e, double val)
326{
327 // set value for parameter e ( external index )
328 fParameters.SetValue(e, val);
329 if (!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
330 unsigned int i = IntOfExt(e);
331 if (Parameter(e).HasLimits())
332 fIntParameters[i] = Ext2int(e, val);
333 else
334 fIntParameters[i] = val;
335 }
336}
337
338void MnUserParameterState::SetError(unsigned int e, double val)
339{
340 // set error for parameter e (external index)
341 fParameters.SetError(e, val);
342}
343
344void MnUserParameterState::SetLimits(unsigned int e, double low, double up)
345{
346 // set limits for parameter e (external index)
347 fParameters.SetLimits(e, low, up);
348 fCovarianceValid = false;
349 fGCCValid = false;
350 if (!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
351 unsigned int i = IntOfExt(e);
352 if (low < fIntParameters[i] && fIntParameters[i] < up)
354 else if (low >= fIntParameters[i])
355 fIntParameters[i] = Ext2int(e, low + 0.1 * Parameter(e).Error());
356 else
357 fIntParameters[i] = Ext2int(e, up - 0.1 * Parameter(e).Error());
358 }
359}
360
361void MnUserParameterState::SetUpperLimit(unsigned int e, double up)
362{
363 // set upper limit for parameter e (external index)
365 fCovarianceValid = false;
366 fGCCValid = false;
367 if (!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
368 unsigned int i = IntOfExt(e);
369 if (fIntParameters[i] < up)
371 else
372 fIntParameters[i] = Ext2int(e, up - 0.1 * Parameter(e).Error());
373 }
374}
375
376void MnUserParameterState::SetLowerLimit(unsigned int e, double low)
377{
378 // set lower limit for parameter e (external index)
380 fCovarianceValid = false;
381 fGCCValid = false;
382 if (!Parameter(e).IsFixed() && !Parameter(e).IsConst()) {
383 unsigned int i = IntOfExt(e);
384 if (low < fIntParameters[i])
386 else
387 fIntParameters[i] = Ext2int(e, low + 0.1 * Parameter(e).Error());
388 }
389}
390
392{
393 // remove limit for parameter e (external index)
395 fCovarianceValid = false;
396 fGCCValid = false;
397 if (!Parameter(e).IsFixed() && !Parameter(e).IsConst())
399}
400
401double MnUserParameterState::Value(unsigned int i) const
402{
403 // get value for parameter e (external index)
404 return fParameters.Value(i);
405}
406double MnUserParameterState::Error(unsigned int i) const
407{
408 // get error for parameter e (external index)
409 return fParameters.Error(i);
410}
411
412// interaction via name of Parameter
413
414void MnUserParameterState::Fix(const std::string &name)
415{
416 Fix(Index(name));
417}
418
419void MnUserParameterState::Release(const std::string &name)
420{
422}
423
424void MnUserParameterState::SetValue(const std::string &name, double val)
425{
426 SetValue(Index(name), val);
427}
428
429void MnUserParameterState::SetError(const std::string &name, double val)
430{
431 SetError(Index(name), val);
432}
433
434void MnUserParameterState::SetLimits(const std::string &name, double low, double up)
435{
436 SetLimits(Index(name), low, up);
437}
438
439void MnUserParameterState::SetUpperLimit(const std::string &name, double up)
440{
442}
443
444void MnUserParameterState::SetLowerLimit(const std::string &name, double low)
445{
446 SetLowerLimit(Index(name), low);
447}
448
450{
452}
453
454double MnUserParameterState::Value(const std::string &name) const
455{
456 return Value(Index(name));
457}
458
459double MnUserParameterState::Error(const std::string &name) const
460{
461 return Error(Index(name));
462}
463
464unsigned int MnUserParameterState::Index(const std::string &name) const
465{
466 // convert name into external number of Parameter
467 return fParameters.Index(name);
468}
469
470const char *MnUserParameterState::Name(unsigned int i) const
471{
472 // convert external number into name of Parameter (API returning a const char *)
473 return fParameters.Name(i);
474}
475const std::string &MnUserParameterState::GetName(unsigned int i) const
476{
477 // convert external number into name of Parameter (new interface returning a string)
478 return fParameters.GetName(i);
479}
480
481// transformation internal <-> external (forward to transformation class)
482
483double MnUserParameterState::Int2ext(unsigned int i, double val) const
484{
485 // internal to external value
486 return fParameters.Trafo().Int2ext(i, val);
487}
488double MnUserParameterState::Ext2int(unsigned int e, double val) const
489{
490 // external to internal value
491 return fParameters.Trafo().Ext2int(e, val);
492}
493unsigned int MnUserParameterState::IntOfExt(unsigned int ext) const
494{
495 // return internal index for external index ext
496 return fParameters.Trafo().IntOfExt(ext);
497}
498unsigned int MnUserParameterState::ExtOfInt(unsigned int internal) const
499{
500 // return external index for internal index internal
501 return fParameters.Trafo().ExtOfInt(internal);
502}
504{
505 // return number of variable parameters
507}
509{
510 // return global parameter precision
511 return fParameters.Precision();
512}
513
515{
516 // set global parameter precision
518}
519
520} // namespace Minuit2
521
522} // namespace ROOT
#define e(i)
Definition RSha256.hxx:103
char name[80]
Definition TGX11.cxx:110
Class describing a symmetric matrix of size n.
Definition LASymMatrix.h:45
const double * Data() const
unsigned int size() const
const MnAlgebraicSymMatrix & InvHessian() const
const MnAlgebraicVector & Dirin() const
MinimumState keeps the information (position, Gradient, 2nd deriv, etc) after one minimization step (...
const MinimumError & Error() const
const MnAlgebraicVector & Vec() const
const MinimumParameters & Parameters() const
class for the individual Minuit Parameter with Name and number; contains the input numbers for the mi...
class to reduce the covariance matrix when a parameter is fixed by removing the corresponding row and...
class for global correlation coefficient
Sets the relative floating point (double) arithmetic precision.
void Warn(const Ts &... args)
Definition MnPrint.h:135
Class containing the covariance matrix data represented as a vector of size n*(n+1)/2 Used to hide in...
const std::vector< double > & Data() const
const MnMachinePrecision & Precision() const
void SetLimits(unsigned int, double, double)
unsigned int Index(const std::string &) const
const std::string & GetName(unsigned int) const
double Int2ext(unsigned int, double) const
const MinuitParameter & Parameter(unsigned int i) const
double Ext2int(unsigned int, double) const
void Add(const std::string &name, double val, double err)
unsigned int ExtOfInt(unsigned int) const
const char * Name(unsigned int) const
MnUserParameterState()
default constructor (invalid state)
const std::vector< ROOT::Minuit2::MinuitParameter > & MinuitParameters() const
facade: forward interface of MnUserParameters and MnUserTransformation
unsigned int IntOfExt(unsigned int) const
API class for the user interaction with the parameters; serves as input to the minimizer as well as o...
double Error(unsigned int) const
std::vector< double > Params() const
access to parameters and errors in column-wise representation
const char * Name(unsigned int) const
const MinuitParameter & Parameter(unsigned int) const
access to single Parameter
unsigned int Index(const std::string &) const
double Value(unsigned int) const
const MnMachinePrecision & Precision() const
void Fix(unsigned int)
interaction via external number of Parameter
void SetLowerLimit(unsigned int, double)
void SetError(unsigned int, double)
void SetValue(unsigned int, double)
const std::vector< ROOT::Minuit2::MinuitParameter > & Parameters() const
access to parameters (row-wise)
const MnUserTransformation & Trafo() const
std::vector< double > Errors() const
const std::string & GetName(unsigned int) const
void SetUpperLimit(unsigned int, double)
bool Add(const std::string &, double, double)
Add free Parameter Name, Value, Error.
void SetLimits(unsigned int, double, double)
class dealing with the transformation between user specified parameters (external) and internal param...
double Ext2int(unsigned int, double) const
MnUserCovariance Int2extCovariance(const MnAlgebraicVector &, const MnAlgebraicSymMatrix &) const
unsigned int ExtOfInt(unsigned int internal) const
const std::vector< MinuitParameter > & Parameters() const
unsigned int IntOfExt(unsigned int) const
double Int2ext(unsigned int, double) const
double Int2extError(unsigned int, double, double) const
CPyCppyy::Parameter Parameter
int Invert(LASymMatrix &)
Definition LaInverse.cxx:21
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...