#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.