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;