#ifndef ROOT_Math_BasicMinimizer
#define ROOT_Math_BasicMinimizer
#ifndef ROOT_Math_Minimizer
#include "Math/Minimizer.h"
#endif
#ifndef ROOT_Math_IFunctionfwd
#include "Math/IFunctionfwd.h"
#endif
#ifndef ROOT_Math_IParamFunctionfwd
#include "Math/IParamFunctionfwd.h"
#endif
#ifndef ROOT_Math_MinimTransformVariable
#include "Math/MinimTransformVariable.h"
#endif
#include <vector>
#include <map>
#include <string>
namespace ROOT {
namespace Math {
class MinimTransformFunction;
class BasicMinimizer : public ROOT::Math::Minimizer {
public:
BasicMinimizer ( );
virtual ~BasicMinimizer ();
private:
BasicMinimizer(const BasicMinimizer &) : Minimizer() {}
BasicMinimizer & operator = (const BasicMinimizer & rhs) {
if (this == &rhs) return *this;
return *this;
}
public:
virtual void SetFunction(const ROOT::Math::IMultiGenFunction & func);
virtual void SetFunction(const ROOT::Math::IMultiGradFunction & func);
virtual bool SetVariable(unsigned int ivar, const std::string & name, double val, double step);
virtual bool SetLowerLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double lower );
virtual bool SetUpperLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double upper );
virtual bool SetLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double , double );
virtual bool SetFixedVariable(unsigned int , const std::string & , double );
virtual bool SetVariableValue(unsigned int ivar, double val );
virtual bool SetVariableValues(const double * x);
virtual bool SetVariableStepSize(unsigned int ivar, double step );
virtual bool SetVariableLowerLimit(unsigned int ivar, double lower);
virtual bool SetVariableUpperLimit(unsigned int ivar, double upper);
virtual bool SetVariableLimits(unsigned int ivar, double lower, double upper);
virtual bool FixVariable(unsigned int ivar);
virtual bool ReleaseVariable(unsigned int ivar);
virtual bool IsFixedVariable(unsigned int ivar) const;
virtual bool GetVariableSettings(unsigned int ivar, ROOT::Fit::ParameterSettings & varObj) const;
virtual std::string VariableName(unsigned int ivar) const;
virtual int VariableIndex(const std::string & name) const;
virtual bool Minimize();
virtual double MinValue() const { return fMinVal; }
virtual const double * X() const { return &fValues.front(); }
virtual unsigned int NDim() const { return fDim; }
virtual unsigned int NFree() const;
virtual unsigned int NPar() const { return fValues.size(); }
const ROOT::Math::IMultiGenFunction * ObjFunction() const { return fObjFunc; }
const ROOT::Math::IMultiGradFunction * GradObjFunction() const;
const ROOT::Math::MinimTransformFunction * TransformFunction() const;
void PrintResult() const;
virtual const double * StepSizes() const { return &fSteps.front(); }
protected:
bool CheckDimension() const;
bool CheckObjFunction() const;
MinimTransformFunction * CreateTransformation(std::vector<double> & startValues, const ROOT::Math::IMultiGradFunction * func = 0);
void SetFinalValues(const double * x);
void SetMinValue(double val) { fMinVal = val; }
private:
unsigned int fDim;
const ROOT::Math::IMultiGenFunction * fObjFunc;
double fMinVal;
std::vector<double> fValues;
std::vector<double> fSteps;
std::vector<std::string> fNames;
std::vector<ROOT::Math::EMinimVariableType> fVarTypes;
std::map< unsigned int, std::pair<double, double> > fBounds;
};
}
}
#endif /* ROOT_Math_BasicMinimizer */