#include <assert.h>
#include "Math/Minimizer1D.h"
#include "GSLFunctionWrapper.h"
#include "GSL1DMinimizer.h"
#include "gsl/gsl_min.h"
#include "gsl/gsl_errno.h"
#include <iostream> 
namespace ROOT { 
namespace Math { 
Minimizer1D::Minimizer1D(Minim1D::Type type) : 
   fIsSet(false)
{
   
   const gsl_min_fminimizer_type* T = 0 ;
   switch ( type )
   {
   case Minim1D::GOLDENSECTION          : 
      T = gsl_min_fminimizer_goldensection; 
      break ;
   case Minim1D::BRENT       :
      T = gsl_min_fminimizer_brent; 
      break ;
   default :
      
      T = gsl_min_fminimizer_brent; 
      break ;
   }
   fMinimizer = new GSL1DMinimizer(T); 
   fFunction  = new GSLFunctionWrapper();
}
Minimizer1D::~Minimizer1D() 
{
   
   if (fMinimizer) delete fMinimizer;
   if (fFunction)  delete  fFunction;
}
Minimizer1D::Minimizer1D(const Minimizer1D &) 
{
   
}
Minimizer1D & Minimizer1D::operator = (const Minimizer1D &rhs) 
{
   
   if (this == &rhs) return *this;  
   return *this;
}
void Minimizer1D::SetFunction(  GSLFuncPointer f, void * p, double xmin, double xlow, double xup) { 
   
   assert(fFunction);
   assert(fMinimizer);
   fXlow = xlow; 
   fXup = xup;
   fXmin = xmin;
   fFunction->SetFuncPointer( f ); 
   fFunction->SetParams( p ); 
   std::cout << " [ "<< xlow << " , " << xup << " ]" << std::endl;
   int status = gsl_min_fminimizer_set( fMinimizer->Get(), fFunction->GetFunc(), xmin, xlow, xup);
   if (status != GSL_SUCCESS) 
      std::cerr <<"Minimizer1D: Error:  Interval [ "<< xlow << " , " << xup << " ] does not contain a minimum" << std::endl; 
   fIsSet = true; 
   return;
}
int Minimizer1D::Iterate() {
   
   if (!fIsSet) {
      std::cerr << "Minimizer1D- Error: Function has not been set in Minimizer" << std::endl;
      return -1; 
   }
 
   int status =  gsl_min_fminimizer_iterate(fMinimizer->Get());
   
   fXmin = gsl_min_fminimizer_x_minimum(fMinimizer->Get() );
   fMin = gsl_min_fminimizer_f_minimum(fMinimizer->Get() );
   
   fXlow =  gsl_min_fminimizer_x_lower(fMinimizer->Get() ); 
   fXup =  gsl_min_fminimizer_x_upper(fMinimizer->Get() );
   fLow =  gsl_min_fminimizer_f_lower(fMinimizer->Get() ); 
   fUp =  gsl_min_fminimizer_f_upper(fMinimizer->Get() );
   return status;
}
double Minimizer1D::XMinimum() const { 
   
   return fXmin;
}
double Minimizer1D::XLower() const { 
   
   return fXlow; 
}
double Minimizer1D::XUpper() const { 
   
   return fXup;
}
double Minimizer1D::FValMinimum() const { 
   
   return fMin;
}
double Minimizer1D::FValLower() const { 
   
   return fLow; 
}
double Minimizer1D::FValUpper() const { 
   
   return fUp;
}
const char * Minimizer1D::Name() const {
   
   return gsl_min_fminimizer_name(fMinimizer->Get() ); 
}
int Minimizer1D::Minimize (int maxIter, double absTol, double relTol) 
{ 
   
   int iter = 0; 
   int status = 0; 
   do { 
      iter++;
      try {
         status = Iterate();
      }
      catch ( std::exception &e) { 
         
         
         return -1; 
      }
  
      status =  TestInterval(fXlow, fXup, absTol, relTol); 
      if (status == GSL_SUCCESS) { 
         fIter = iter;
         return status; 
      }
   }
   while (status == GSL_CONTINUE && iter < maxIter); 
   return status;
}
int Minimizer1D::TestInterval( double xlow, double xup, double epsAbs, double epsRel) { 
   return gsl_min_test_interval(xlow, xup, epsAbs, epsRel);
}
} 
} 
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.