// @(#)root/minuit2:$Id$
// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
 *                                                                    *
 **********************************************************************/

#ifndef ROOT_Minuit2_MnHesse
#define ROOT_Minuit2_MnHesse

#include "Minuit2/MnConfig.h"
#include "Minuit2/MnStrategy.h"

#include <vector>

namespace ROOT {

   namespace Minuit2 {


class FCNBase;
class MnUserParameterState;
class MnUserParameters;
class MnUserCovariance;
class MnUserTransformation;
class MinimumState;
class MnMachinePrecision;
class MnFcn;
class FunctionMinimum;

//_______________________________________________________________________
/**
    API class for calculating the numerical covariance matrix
    (== 2x Inverse Hessian == 2x Inverse 2nd derivative); can be used by the
    user or Minuit itself
 */

class MnHesse {

public:

   /// default constructor with default strategy
   MnHesse() : fStrategy(MnStrategy(1)) {}

   /// constructor with user-defined strategy level
   MnHesse(unsigned int stra) : fStrategy(MnStrategy(stra)) {}

   /// conctructor with specific strategy
   MnHesse(const MnStrategy& stra) : fStrategy(stra) {}

   ~MnHesse() {}

   ///
   /// low-level API
   ///
   /// FCN + parameters + errors
   MnUserParameterState operator()(const FCNBase&, const std::vector<double>&, const std::vector<double>&, unsigned int maxcalls=0) const;
   /// FCN + parameters + covariance
   MnUserParameterState operator()(const FCNBase&, const std::vector<double>&,  unsigned int nrow, const std::vector<double>&, unsigned int maxcalls = 0) const;
   /// FCN + parameters + MnUserCovariance
   MnUserParameterState operator()(const FCNBase&, const std::vector<double>&, const MnUserCovariance&, unsigned int maxcalls=0) const;
   ///
   /// high-level API
   ///
   /// FCN + MnUserParameters
   MnUserParameterState operator()(const FCNBase&, const MnUserParameters&, unsigned int maxcalls=0) const;
   /// FCN + MnUserParameters + MnUserCovariance
   MnUserParameterState operator()(const FCNBase&, const MnUserParameters&, const MnUserCovariance&, unsigned int maxcalls=0) const;
   /// FCN + MnUserParameterState
   MnUserParameterState operator()(const FCNBase&, const MnUserParameterState&, unsigned int maxcalls=0) const;
   ///
   /// API to use MnHesse after minimization when function mimimum is avalilable, otherwise information on the last state will be
   /// lost. (It would be needed to re-call the gradient and spend extra useless function calls)
   /// The Function Minimum is updated (modified) by adding the Hesse results as last state of minimization
   ///
   void operator()(const FCNBase&, FunctionMinimum&, unsigned int maxcalls=0) const;


   /// internal interface
   ///
   MinimumState operator()(const MnFcn&, const MinimumState&, const MnUserTransformation&, unsigned int maxcalls=0) const;

   /// forward interface of MnStrategy
   unsigned int Ncycles() const {return fStrategy.HessianNCycles();}
   double Tolerstp() const {return fStrategy.HessianStepTolerance();}
   double TolerG2() const {return fStrategy.HessianG2Tolerance();}

private:

   MnStrategy fStrategy;
};

  }  // namespace Minuit2

}  // namespace ROOT

#endif  // ROOT_Minuit2_MnHesse
 MnHesse.h:1
 MnHesse.h:2
 MnHesse.h:3
 MnHesse.h:4
 MnHesse.h:5
 MnHesse.h:6
 MnHesse.h:7
 MnHesse.h:8
 MnHesse.h:9
 MnHesse.h:10
 MnHesse.h:11
 MnHesse.h:12
 MnHesse.h:13
 MnHesse.h:14
 MnHesse.h:15
 MnHesse.h:16
 MnHesse.h:17
 MnHesse.h:18
 MnHesse.h:19
 MnHesse.h:20
 MnHesse.h:21
 MnHesse.h:22
 MnHesse.h:23
 MnHesse.h:24
 MnHesse.h:25
 MnHesse.h:26
 MnHesse.h:27
 MnHesse.h:28
 MnHesse.h:29
 MnHesse.h:30
 MnHesse.h:31
 MnHesse.h:32
 MnHesse.h:33
 MnHesse.h:34
 MnHesse.h:35
 MnHesse.h:36
 MnHesse.h:37
 MnHesse.h:38
 MnHesse.h:39
 MnHesse.h:40
 MnHesse.h:41
 MnHesse.h:42
 MnHesse.h:43
 MnHesse.h:44
 MnHesse.h:45
 MnHesse.h:46
 MnHesse.h:47
 MnHesse.h:48
 MnHesse.h:49
 MnHesse.h:50
 MnHesse.h:51
 MnHesse.h:52
 MnHesse.h:53
 MnHesse.h:54
 MnHesse.h:55
 MnHesse.h:56
 MnHesse.h:57
 MnHesse.h:58
 MnHesse.h:59
 MnHesse.h:60
 MnHesse.h:61
 MnHesse.h:62
 MnHesse.h:63
 MnHesse.h:64
 MnHesse.h:65
 MnHesse.h:66
 MnHesse.h:67
 MnHesse.h:68
 MnHesse.h:69
 MnHesse.h:70
 MnHesse.h:71
 MnHesse.h:72
 MnHesse.h:73
 MnHesse.h:74
 MnHesse.h:75
 MnHesse.h:76
 MnHesse.h:77
 MnHesse.h:78
 MnHesse.h:79
 MnHesse.h:80
 MnHesse.h:81
 MnHesse.h:82
 MnHesse.h:83
 MnHesse.h:84
 MnHesse.h:85
 MnHesse.h:86
 MnHesse.h:87
 MnHesse.h:88
 MnHesse.h:89
 MnHesse.h:90
 MnHesse.h:91
 MnHesse.h:92
 MnHesse.h:93
 MnHesse.h:94
 MnHesse.h:95
 MnHesse.h:96
 MnHesse.h:97
 MnHesse.h:98
 MnHesse.h:99