27 #ifndef ROOT_Math_GSLNLSMinimizer 
   28 #define ROOT_Math_GSLNLSMinimizer 
   67 class LSResidualFunc : 
public IMultiGradFunction {
 
   71    LSResidualFunc() : fIndex(0), fChi2(0)
 
   75    LSResidualFunc(
const ROOT::Math::FitMethodFunction & func, 
unsigned int i) :
 
   78       fX2(std::vector<double>(func.NDim() ) )
 
   83    LSResidualFunc(
const LSResidualFunc & rhs) :
 
   91    LSResidualFunc & operator= (
const LSResidualFunc & rhs)
 
   99    IMultiGenFunction * Clone()
 const {
 
  100       return new LSResidualFunc(*fChi2,fIndex);
 
  103    unsigned int NDim()
 const { 
return fChi2->NDim(); }
 
  105    void Gradient( 
const double * x, 
double * g)
 const {
 
  110    void FdF (
const double * x, 
double & f, 
double * g)
 const {
 
  111       unsigned int n = NDim();
 
  112       std::copy(x,x+n,fX2.begin());
 
  113       const double kEps = 1.0E-4;
 
  115       for (
unsigned int i = 0; i < n; ++i) {
 
  117          g[i] =  ( DoEval(&fX2.front()) - f )/kEps;
 
  125    double DoEval (
const double * x)
 const {
 
  126       return fChi2->DataElement(x, fIndex);
 
  129    double DoDerivative(
const double * x, 
unsigned int icoord)
 const {
 
  131       std::copy(x,x+NDim(),fX2.begin());
 
  132       const double kEps = 1.0E-4;
 
  134       return ( DoEval(&fX2.front()) - DoEval(x) )/kEps;
 
  138    const ROOT::Math::FitMethodFunction * fChi2;
 
  139    mutable std::vector<double> fX2;  
 
  152 class GSLNLSMinimizer : 
public  ROOT::Math::BasicMinimizer {
 
  159    GSLNLSMinimizer (
int type = 0);
 
  172    GSLNLSMinimizer(
const GSLNLSMinimizer &) : ROOT::Math::BasicMinimizer() {}
 
  177    GSLNLSMinimizer & operator = (
const GSLNLSMinimizer & rhs)  {
 
  178       if (
this == &rhs) 
return *
this;  
 
  185    virtual void SetFunction(
const ROOT::Math::IMultiGenFunction & func);
 
  188    virtual void SetFunction(
const ROOT::Math::IMultiGradFunction & func);
 
  192    virtual  bool Minimize();
 
  196    virtual double Edm()
 const { 
return fEdm; } 
 
  200    virtual const double *  MinGradient() 
const;
 
  203    virtual unsigned int NCalls()
 const { 
return (fChi2Func) ? fChi2Func->NCalls() : 0; }
 
  210    virtual bool ProvidesError()
 const { 
return true; }
 
  213    virtual const double * Errors()
 const { 
return (fErrors.size() > 0) ? &fErrors.front() : 0; }
 
  224    virtual double CovMatrix(
unsigned int , 
unsigned int ) 
const;
 
  227    virtual int CovMatrixStatus() 
const;
 
  237    ROOT::Math::GSLMultiFit * fGSLMultiFit;        
 
  238    const ROOT::Math::FitMethodFunction * fChi2Func;      
 
  242    std::vector<double> fErrors;
 
  243    std::vector<double> fCovMatrix;              
 
  244    std::vector<LSResidualFunc> fResiduals;