Jpp  19.0.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Types | Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Protected Attributes | List of all members
JROOT::JRootfit_t< JFs_t > Class Template Reference

Base class for result of ROOT Fit. More...

#include <JRootfit.hh>

Inheritance diagram for JROOT::JRootfit_t< JFs_t >:
JFIT::JGandalf< JModel_t > JEEP::JMessage< T > JROOT::JRootfit< JFs_t >

Public Types

typedef JFIT_LOCAL::JTypedef_t
< JModel_t >::parameter_type 
parameter_type
 Data type of fit parameter. More...
 

Public Member Functions

const JFs_t & getFunction () const
 Get function. More...
 
size_t getNumberOfParameters () const
 Get number of parameters. More...
 
size_t getNumberOfFreeParameters () const
 Get number of free parameters. More...
 
size_t getN () const
 Get number of data points. More...
 
double getChi2 () const
 Get chi2. More...
 
int getNDF () const
 Get number of degrees of freedom. More...
 
double getValue (size_t i) const
 Get value of parameter at given index. More...
 
double getError (size_t i) const
 Get error of parameter at given index. More...
 
template<class JFunction_t , class T , class... Args>
result_type operator() (const JFunction_t &fit, T __begin, T __end, Args...args)
 Multi-dimensional fit of multiple data sets. More...
 

Public Attributes

std::vector< parameter_typeparameters
 fit parameters More...
 
int numberOfIterations
 number of iterations More...
 
double lambda
 control parameter More...
 
JModel_t value
 value More...
 
JModel_t error
 error More...
 
JMATH::JMatrixNS V
 Hesse matrix. More...
 

Static Public Attributes

static int MAXIMUM_ITERATIONS = 1000
 maximal number of iterations More...
 
static double EPSILON = 1.0e-3
 maximal distance to minimum More...
 
static double LAMBDA_MIN = 0.01
 minimal value control parameter More...
 
static double LAMBDA_MAX = 100.0
 maximal value control parameter More...
 
static double LAMBDA_UP = 10.0
 multiplication factor control parameter More...
 
static double LAMBDA_DOWN = 10.0
 multiplication factor control parameter More...
 
static double PIVOT = std::numeric_limits<double>::epsilon()
 minimal value diagonal element of Hesse matrix More...
 
static int debug = 0
 debug level (default is off). More...
 

Protected Member Functions

 JRootfit_t ()
 Default constructor. More...
 

Protected Attributes

size_t npx
 number of data points More...
 
double chi2
 chi2 More...
 

Detailed Description

template<class JFs_t>
class JROOT::JRootfit_t< JFs_t >

Base class for result of ROOT Fit.

Definition at line 828 of file JRootfit.hh.

Member Typedef Documentation

template<class JModel_t>
typedef JFIT_LOCAL::JTypedef_t<JModel_t>::parameter_type JFIT::JGandalf< JModel_t >::parameter_type
inherited

Data type of fit parameter.

Definition at line 95 of file JGandalf.hh.

Constructor & Destructor Documentation

template<class JFs_t >
JROOT::JRootfit_t< JFs_t >::JRootfit_t ( )
inlineprotected

Default constructor.

Definition at line 835 of file JRootfit.hh.

835  :
836  npx (0),
837  chi2(0.0)
838  {}
size_t npx
number of data points
Definition: JRootfit.hh:841
double chi2
chi2
Definition: JRootfit.hh:842

Member Function Documentation

template<class JFs_t >
const JFs_t& JROOT::JRootfit_t< JFs_t >::getFunction ( ) const
inline

Get function.

Returns
function.

Definition at line 850 of file JRootfit.hh.

851  {
852  return this->value;
853  }
JModel_t value
value
Definition: JGandalf.hh:346
template<class JFs_t >
size_t JROOT::JRootfit_t< JFs_t >::getNumberOfParameters ( ) const
inline

Get number of parameters.

Returns
number of parameters

Definition at line 861 of file JRootfit.hh.

862  {
863  return JFs_t::parameters.size();
864  }
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
template<class JFs_t >
size_t JROOT::JRootfit_t< JFs_t >::getNumberOfFreeParameters ( ) const
inline

Get number of free parameters.

Returns
number of free parameters

Definition at line 872 of file JRootfit.hh.

873  {
874  return this->parameters.size();
875  }
std::vector< parameter_type > parameters
fit parameters
Definition: JGandalf.hh:343
template<class JFs_t >
size_t JROOT::JRootfit_t< JFs_t >::getN ( ) const
inline

Get number of data points.

Returns
number of data points

Definition at line 883 of file JRootfit.hh.

884  {
885  return npx;
886  }
size_t npx
number of data points
Definition: JRootfit.hh:841
template<class JFs_t >
double JROOT::JRootfit_t< JFs_t >::getChi2 ( ) const
inline

Get chi2.

Returns
chi2

Definition at line 894 of file JRootfit.hh.

895  {
896  return chi2;
897  }
double chi2
chi2
Definition: JRootfit.hh:842
template<class JFs_t >
int JROOT::JRootfit_t< JFs_t >::getNDF ( ) const
inline

Get number of degrees of freedom.

Returns
number of degrees of freedom

Definition at line 905 of file JRootfit.hh.

906  {
907  return (int) getN() - (int) getNumberOfFreeParameters();
908  }
size_t getNumberOfFreeParameters() const
Get number of free parameters.
Definition: JRootfit.hh:872
size_t getN() const
Get number of data points.
Definition: JRootfit.hh:883
template<class JFs_t >
double JROOT::JRootfit_t< JFs_t >::getValue ( size_t  i) const
inline

Get value of parameter at given index.

Parameters
iindex

Definition at line 916 of file JRootfit.hh.

917  {
918  return getParameter(this->value, i);
919  }
int getParameter(const std::string &text)
Get parameter number from text string.
JModel_t value
value
Definition: JGandalf.hh:346
template<class JFs_t >
double JROOT::JRootfit_t< JFs_t >::getError ( size_t  i) const
inline

Get error of parameter at given index.

Parameters
iindex

Definition at line 927 of file JRootfit.hh.

928  {
929  return getParameter(this->error, i);
930  }
int getParameter(const std::string &text)
Get parameter number from text string.
JModel_t error
error
Definition: JGandalf.hh:347
template<class JModel_t>
template<class JFunction_t , class T , class... Args>
result_type JFIT::JGandalf< JModel_t >::operator() ( const JFunction_t &  fit,
T  __begin,
T  __end,
Args...  args 
)
inlineinherited

Multi-dimensional fit of multiple data sets.

The fit function should return the chi2 as well as the partial derivatives for the current value of the model and a given data point.

Parameters
fitfit function
__beginbegin of data
__endend of data
argsoptional data
Returns
chi2 and gradient

Definition at line 160 of file JGandalf.hh.

161  {
162  using namespace std;
163  using namespace JPP;
164 
165  // note that all model values should be assigned to the start value of the model before use
166  // because the actual list of model parameters can vary from fit to fit
167  // (e.g. if model consists of a container).
168 
169  const size_t N = parameters.size();
170 
171  V.resize(N);
172  h.resize(N);
173  x.resize(N);
174 
175  previous.result.chi2 = numeric_limits<double>::max();
176 
177  current.result.chi2 = numeric_limits<double>::max();
178  current.result.gradient = value;
179  current.result.gradient = zero;
180 
181  error = value;
182  error = zero;
183 
184  lambda = LAMBDA_MIN;
185 
187 
188  DEBUG("step: " << numberOfIterations << endl);
189 
190  reset();
191 
192  update(fit, __begin, __end, args...);
193 
194  DEBUG("lambda: " << FIXED(12,5) << lambda << endl);
195  DEBUG("chi2: " << FIXED(12,5) << current.result.chi2 << endl);
196 
197  if (current.result.chi2 < previous.result.chi2) {
198 
199  if (numberOfIterations != 0) {
200 
201  if (fabs(previous.result.chi2 - current.result.chi2) < EPSILON*fabs(previous.result.chi2)) {
202 
203  // normal end
204 
205  const result_type result = current.result;
206 
207  lambda = LAMBDA_MIN;
208 
209  reset();
210 
211  update(fit, __begin, __end, args...);
212 
213  try {
214  V.invert();
215  }
216  catch (const exception& error) {
217  V.reset();
218  }
219 
220  for (size_t i = 0; i != N; ++i) {
221  get(error, parameters[i]) = sqrt(V(i,i));
222  }
223 
224  return result;
225  }
226 
227  if (lambda > LAMBDA_MIN) {
228  lambda /= LAMBDA_DOWN;
229  }
230  }
231 
232  // store current values
233 
234  previous.value = value;
235  previous.result = current.result;
236 
237  } else {
238 
239  value = previous.value; // restore value
240 
241  lambda *= LAMBDA_UP;
242 
243  if (lambda > LAMBDA_MAX) {
244  break;
245  }
246 
247  reset();
248 
249  update(fit, __begin, __end, args...);
250  }
251 
252  DEBUG("Hesse matrix:" << endl << V << endl);
253 
254  // force definite positiveness
255 
256  for (size_t i = 0; i != N; ++i) {
257 
258  if (V(i,i) < PIVOT) {
259  V(i,i) = PIVOT;
260  }
261 
262  h[i] = 1.0 / sqrt(V(i,i));
263  }
264 
265  // normalisation
266 
267  for (size_t row = 0; row != N; ++row) {
268  for (size_t col = 0; col != row; ++col) {
269  V(row,col) *= h[row] * h[col];
270  V(col,row) = V(row,col);
271  }
272  }
273 
274  for (size_t i = 0; i != N; ++i) {
275  V(i,i) = 1.0 + lambda;
276  }
277 
278  // solve A x = b
279 
280  for (size_t col = 0; col != N; ++col) {
281  x[col] = h[col] * get(current.result.gradient, parameters[col]);
282  }
283 
284  try {
285  V.solve(x);
286  }
287  catch (const exception& error) {
288 
289  ERROR("JGandalf: " << error.what() << endl << V << endl);
290 
291  break;
292  }
293 
294  // update value
295 
296  for (size_t row = 0; row != N; ++row) {
297 
298  DEBUG("u[" << noshowpos << setw(3) << row << "] = " << showpos << FIXED(15,5) << get(value, parameters[row]));
299 
300  get(value, parameters[row]) -= h[row] * x[row];
301 
302  DEBUG(" -> " << FIXED(15,5) << get(value, parameters[row]) << noshowpos << endl);
303  }
304 
305  model(value);
306  }
307 
308  // abnormal end
309 
310  const result_type result = previous.result;
311 
312  value = previous.value; // restore value
313 
314  lambda = LAMBDA_MIN;
315 
316  reset();
317 
318  update(fit, __begin, __end, args...);
319 
320  try {
321  V.invert();
322  }
323  catch (const exception& error) {
324  V.reset();
325  }
326 
327  for (size_t i = 0; i != N; ++i) {
328  get(error, parameters[i]) = sqrt(V(i,i));
329  }
330 
331  return result;
332  }
double lambda
control parameter
Definition: JGandalf.hh:345
static double EPSILON
maximal distance to minimum
Definition: JGandalf.hh:336
JMATH::JVectorND x
Definition: JGandalf.hh:488
JModel_t value
value
Definition: JGandalf.hh:346
static double PIVOT
minimal value diagonal element of Hesse matrix
Definition: JGandalf.hh:341
JMATH::JMatrixNS V
Hesse matrix.
Definition: JGandalf.hh:348
static const JZero zero
Function object to assign zero value.
Definition: JZero.hh:105
JMatrixND & reset()
Set matrix to the null matrix.
Definition: JMatrixND.hh:459
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
std::vector< parameter_type > parameters
fit parameters
Definition: JGandalf.hh:343
void resize(const size_t size)
Resize matrix.
Definition: JMatrixND.hh:446
static double LAMBDA_MIN
minimal value control parameter
Definition: JGandalf.hh:337
static double LAMBDA_DOWN
multiplication factor control parameter
Definition: JGandalf.hh:340
void reset()
Reset current parameters.
Definition: JGandalf.hh:354
#define ERROR(A)
Definition: JMessage.hh:66
void update(const JFunction_t &fit, T __begin, T __end, Args...args)
Recursive method to update current parameters.
Definition: JGandalf.hh:374
struct JFIT::JGandalf::@10 current
result_type result
Definition: JGandalf.hh:491
static double LAMBDA_UP
multiplication factor control parameter
Definition: JGandalf.hh:339
void invert()
Invert matrix according LDU decomposition.
Definition: JMatrixNS.hh:75
then usage $script< input file >[option[primary[working directory]]] nWhere option can be N
Definition: JMuonPostfit.sh:40
void solve(JVectorND_t &u)
Get solution of equation A x = b.
Definition: JMatrixNS.hh:308
static int MAXIMUM_ITERATIONS
maximal number of iterations
Definition: JGandalf.hh:335
int numberOfIterations
number of iterations
Definition: JGandalf.hh:344
void model(JModel_t &value)
Auxiliary function to constrain model during fit.
Definition: JGandalf.hh:56
static double LAMBDA_MAX
maximal value control parameter
Definition: JGandalf.hh:338
JModel_t error
error
Definition: JGandalf.hh:347
struct JFIT::JGandalf::@11 previous
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
std::vector< double > h
Definition: JGandalf.hh:487

Member Data Documentation

template<class JFs_t >
size_t JROOT::JRootfit_t< JFs_t >::npx
protected

number of data points

Definition at line 841 of file JRootfit.hh.

template<class JFs_t >
double JROOT::JRootfit_t< JFs_t >::chi2
protected

chi2

Definition at line 842 of file JRootfit.hh.

template<class JModel_t>
int JFIT::JGandalf< JModel_t >::MAXIMUM_ITERATIONS = 1000
staticinherited

maximal number of iterations

maximal number of iterations.

Definition at line 335 of file JGandalf.hh.

template<class JModel_t>
double JFIT::JGandalf< JModel_t >::EPSILON = 1.0e-3
staticinherited

maximal distance to minimum

maximal distance to minimum.

Definition at line 336 of file JGandalf.hh.

template<class JModel_t>
double JFIT::JGandalf< JModel_t >::LAMBDA_MIN = 0.01
staticinherited

minimal value control parameter

Definition at line 337 of file JGandalf.hh.

template<class JModel_t>
double JFIT::JGandalf< JModel_t >::LAMBDA_MAX = 100.0
staticinherited

maximal value control parameter

Definition at line 338 of file JGandalf.hh.

template<class JModel_t>
double JFIT::JGandalf< JModel_t >::LAMBDA_UP = 10.0
staticinherited

multiplication factor control parameter

Definition at line 339 of file JGandalf.hh.

template<class JModel_t>
double JFIT::JGandalf< JModel_t >::LAMBDA_DOWN = 10.0
staticinherited

multiplication factor control parameter

Definition at line 340 of file JGandalf.hh.

template<class JModel_t>
double JFIT::JGandalf< JModel_t >::PIVOT = std::numeric_limits<double>::epsilon()
staticinherited

minimal value diagonal element of Hesse matrix

minimal value diagonal element of matrix

Definition at line 341 of file JGandalf.hh.

template<class JModel_t>
std::vector<parameter_type> JFIT::JGandalf< JModel_t >::parameters
inherited

fit parameters

Definition at line 343 of file JGandalf.hh.

template<class JModel_t>
int JFIT::JGandalf< JModel_t >::numberOfIterations
inherited

number of iterations

Definition at line 344 of file JGandalf.hh.

template<class JModel_t>
double JFIT::JGandalf< JModel_t >::lambda
inherited

control parameter

Definition at line 345 of file JGandalf.hh.

template<class JModel_t>
JModel_t JFIT::JGandalf< JModel_t >::value
inherited

value

Definition at line 346 of file JGandalf.hh.

template<class JModel_t>
JModel_t JFIT::JGandalf< JModel_t >::error
inherited

error

Definition at line 347 of file JGandalf.hh.

template<class JModel_t>
JMATH::JMatrixNS JFIT::JGandalf< JModel_t >::V
inherited

Hesse matrix.

Definition at line 348 of file JGandalf.hh.

template<class JModel_t>
result_type JFIT::JGandalf< JModel_t >::result
inherited

Definition at line 491 of file JGandalf.hh.

template<class T>
int JEEP::JMessage< T >::debug = 0
staticinherited

debug level (default is off).

Definition at line 45 of file JMessage.hh.


The documentation for this class was generated from the following file: