// @(#)root/mathmore:$Id$
// Author: L. Moneta Oct 2012

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2006  LCG ROOT Math Team, CERN/PH-SFT                *
 *                                                                    *
 *                                                                    *
 **********************************************************************/


// Header file for class BasicMinimizer

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



//_______________________________________________________________________________
/**
   Base Minimizer class, which defines the basic funcionality of various minimizer
   implementations (apart from Minuit and Minuit2)
   It provides support for storing parameter values, step size,
   parameter transofrmation etc.. in case real minimizer impelmentations do not provide
   such functionality.
   This is an internal class and should not be used directly by the user

   @ingroup MultiMin
*/


class BasicMinimizer : public ROOT::Math::Minimizer {

public:

   /**
      Default constructor
   */
   BasicMinimizer ( );


   /**
      Destructor
   */
   virtual ~BasicMinimizer ();

private:
   // usually copying is non trivial, so we make this unaccessible

   /**
      Copy constructor
   */
   BasicMinimizer(const BasicMinimizer &) : Minimizer() {}

   /**
      Assignment operator
   */
   BasicMinimizer & operator = (const BasicMinimizer & rhs) {
      if (this == &rhs) return *this;  // time saving self-test
      return *this;
   }

public:

   /// set the function to minimize
   virtual void SetFunction(const ROOT::Math::IMultiGenFunction & func);

   /// set gradient the function to minimize
   virtual void SetFunction(const ROOT::Math::IMultiGradFunction & func);

   /// set free variable
   virtual bool SetVariable(unsigned int ivar, const std::string & name, double val, double step);


   /// set lower limit variable  (override if minimizer supports them )
   virtual bool SetLowerLimitedVariable(unsigned int  ivar , const std::string & name , double val , double step , double lower );
   /// set upper limit variable (override if minimizer supports them )
   virtual bool SetUpperLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double upper );
   /// set upper/lower limited variable (override if minimizer supports them )
   virtual bool SetLimitedVariable(unsigned int ivar , const std::string & name , double val , double step , double /* lower */, double /* upper */);
   /// set fixed variable (override if minimizer supports them )
   virtual bool SetFixedVariable(unsigned int /* ivar */, const std::string & /* name */, double /* val */);
   /// set the value of an existing variable
   virtual bool SetVariableValue(unsigned int ivar, double val );
   /// set the values of all existing variables (array must be dimensioned to the size of existing parameters)
   virtual bool SetVariableValues(const double * x);
   /// set the step size of an already existing variable
   virtual bool SetVariableStepSize(unsigned int ivar, double step );
   /// set the lower-limit of an already existing variable
   virtual bool SetVariableLowerLimit(unsigned int ivar, double lower);
   /// set the upper-limit of an already existing variable
   virtual bool SetVariableUpperLimit(unsigned int ivar, double upper);
   /// set the limits of an already existing variable
   virtual bool SetVariableLimits(unsigned int ivar, double lower, double upper);
   /// fix an existing variable
   virtual bool FixVariable(unsigned int ivar);
   /// release an existing variable
   virtual bool ReleaseVariable(unsigned int ivar);
   /// query if an existing variable is fixed (i.e. considered constant in the minimization)
   /// note that by default all variables are not fixed
   virtual bool IsFixedVariable(unsigned int ivar)  const;
   /// get variable settings in a variable object (like ROOT::Fit::ParamsSettings)
   virtual bool GetVariableSettings(unsigned int ivar, ROOT::Fit::ParameterSettings & varObj) const;
   /// get name of variables (override if minimizer support storing of variable names)
   virtual std::string VariableName(unsigned int ivar) const;
   /// get index of variable given a variable given a name
   /// return -1 if variable is not found
   virtual int VariableIndex(const std::string & name) const;

   /// method to perform the minimization
   virtual  bool Minimize();

   /// return minimum function value
   virtual double MinValue() const { return fMinVal; }

   /// return  pointer to X values at the minimum
   virtual const double *  X() const { return &fValues.front(); }

   /// number of dimensions
   virtual unsigned int NDim() const { return fDim; }

   /// number of free variables (real dimension of the problem)
   virtual unsigned int NFree() const;

   /// total number of parameter defined
   virtual unsigned int NPar() const { return fValues.size(); }

   /// return pointer to used objective function
   const ROOT::Math::IMultiGenFunction * ObjFunction() const { return fObjFunc; }

   /// return pointer to used gradient object function  (NULL if gradient is not supported)
   const ROOT::Math::IMultiGradFunction * GradObjFunction() const;

   /// return transformation function (NULL if not having a transformation)
   const ROOT::Math::MinimTransformFunction * TransformFunction() const;

   /// print result of minimization
   void PrintResult() const;

   /// accessor methods
   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:

   // dimension of the function to be minimized
   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;  // vector specifyng the type of variables
   std::map< unsigned int, std::pair<double, double> > fBounds; // map specifying the bound using as key the parameter index

};

   } // end namespace Fit

} // end namespace ROOT



#endif /* ROOT_Math_BasicMinimizer */
 BasicMinimizer.h:1
 BasicMinimizer.h:2
 BasicMinimizer.h:3
 BasicMinimizer.h:4
 BasicMinimizer.h:5
 BasicMinimizer.h:6
 BasicMinimizer.h:7
 BasicMinimizer.h:8
 BasicMinimizer.h:9
 BasicMinimizer.h:10
 BasicMinimizer.h:11
 BasicMinimizer.h:12
 BasicMinimizer.h:13
 BasicMinimizer.h:14
 BasicMinimizer.h:15
 BasicMinimizer.h:16
 BasicMinimizer.h:17
 BasicMinimizer.h:18
 BasicMinimizer.h:19
 BasicMinimizer.h:20
 BasicMinimizer.h:21
 BasicMinimizer.h:22
 BasicMinimizer.h:23
 BasicMinimizer.h:24
 BasicMinimizer.h:25
 BasicMinimizer.h:26
 BasicMinimizer.h:27
 BasicMinimizer.h:28
 BasicMinimizer.h:29
 BasicMinimizer.h:30
 BasicMinimizer.h:31
 BasicMinimizer.h:32
 BasicMinimizer.h:33
 BasicMinimizer.h:34
 BasicMinimizer.h:35
 BasicMinimizer.h:36
 BasicMinimizer.h:37
 BasicMinimizer.h:38
 BasicMinimizer.h:39
 BasicMinimizer.h:40
 BasicMinimizer.h:41
 BasicMinimizer.h:42
 BasicMinimizer.h:43
 BasicMinimizer.h:44
 BasicMinimizer.h:45
 BasicMinimizer.h:46
 BasicMinimizer.h:47
 BasicMinimizer.h:48
 BasicMinimizer.h:49
 BasicMinimizer.h:50
 BasicMinimizer.h:51
 BasicMinimizer.h:52
 BasicMinimizer.h:53
 BasicMinimizer.h:54
 BasicMinimizer.h:55
 BasicMinimizer.h:56
 BasicMinimizer.h:57
 BasicMinimizer.h:58
 BasicMinimizer.h:59
 BasicMinimizer.h:60
 BasicMinimizer.h:61
 BasicMinimizer.h:62
 BasicMinimizer.h:63
 BasicMinimizer.h:64
 BasicMinimizer.h:65
 BasicMinimizer.h:66
 BasicMinimizer.h:67
 BasicMinimizer.h:68
 BasicMinimizer.h:69
 BasicMinimizer.h:70
 BasicMinimizer.h:71
 BasicMinimizer.h:72
 BasicMinimizer.h:73
 BasicMinimizer.h:74
 BasicMinimizer.h:75
 BasicMinimizer.h:76
 BasicMinimizer.h:77
 BasicMinimizer.h:78
 BasicMinimizer.h:79
 BasicMinimizer.h:80
 BasicMinimizer.h:81
 BasicMinimizer.h:82
 BasicMinimizer.h:83
 BasicMinimizer.h:84
 BasicMinimizer.h:85
 BasicMinimizer.h:86
 BasicMinimizer.h:87
 BasicMinimizer.h:88
 BasicMinimizer.h:89
 BasicMinimizer.h:90
 BasicMinimizer.h:91
 BasicMinimizer.h:92
 BasicMinimizer.h:93
 BasicMinimizer.h:94
 BasicMinimizer.h:95
 BasicMinimizer.h:96
 BasicMinimizer.h:97
 BasicMinimizer.h:98
 BasicMinimizer.h:99
 BasicMinimizer.h:100
 BasicMinimizer.h:101
 BasicMinimizer.h:102
 BasicMinimizer.h:103
 BasicMinimizer.h:104
 BasicMinimizer.h:105
 BasicMinimizer.h:106
 BasicMinimizer.h:107
 BasicMinimizer.h:108
 BasicMinimizer.h:109
 BasicMinimizer.h:110
 BasicMinimizer.h:111
 BasicMinimizer.h:112
 BasicMinimizer.h:113
 BasicMinimizer.h:114
 BasicMinimizer.h:115
 BasicMinimizer.h:116
 BasicMinimizer.h:117
 BasicMinimizer.h:118
 BasicMinimizer.h:119
 BasicMinimizer.h:120
 BasicMinimizer.h:121
 BasicMinimizer.h:122
 BasicMinimizer.h:123
 BasicMinimizer.h:124
 BasicMinimizer.h:125
 BasicMinimizer.h:126
 BasicMinimizer.h:127
 BasicMinimizer.h:128
 BasicMinimizer.h:129
 BasicMinimizer.h:130
 BasicMinimizer.h:131
 BasicMinimizer.h:132
 BasicMinimizer.h:133
 BasicMinimizer.h:134
 BasicMinimizer.h:135
 BasicMinimizer.h:136
 BasicMinimizer.h:137
 BasicMinimizer.h:138
 BasicMinimizer.h:139
 BasicMinimizer.h:140
 BasicMinimizer.h:141
 BasicMinimizer.h:142
 BasicMinimizer.h:143
 BasicMinimizer.h:144
 BasicMinimizer.h:145
 BasicMinimizer.h:146
 BasicMinimizer.h:147
 BasicMinimizer.h:148
 BasicMinimizer.h:149
 BasicMinimizer.h:150
 BasicMinimizer.h:151
 BasicMinimizer.h:152
 BasicMinimizer.h:153
 BasicMinimizer.h:154
 BasicMinimizer.h:155
 BasicMinimizer.h:156
 BasicMinimizer.h:157
 BasicMinimizer.h:158
 BasicMinimizer.h:159
 BasicMinimizer.h:160
 BasicMinimizer.h:161
 BasicMinimizer.h:162
 BasicMinimizer.h:163
 BasicMinimizer.h:164
 BasicMinimizer.h:165
 BasicMinimizer.h:166
 BasicMinimizer.h:167
 BasicMinimizer.h:168
 BasicMinimizer.h:169
 BasicMinimizer.h:170
 BasicMinimizer.h:171
 BasicMinimizer.h:172
 BasicMinimizer.h:173
 BasicMinimizer.h:174
 BasicMinimizer.h:175
 BasicMinimizer.h:176
 BasicMinimizer.h:177
 BasicMinimizer.h:178
 BasicMinimizer.h:179
 BasicMinimizer.h:180
 BasicMinimizer.h:181
 BasicMinimizer.h:182
 BasicMinimizer.h:183
 BasicMinimizer.h:184
 BasicMinimizer.h:185
 BasicMinimizer.h:186
 BasicMinimizer.h:187
 BasicMinimizer.h:188
 BasicMinimizer.h:189
 BasicMinimizer.h:190
 BasicMinimizer.h:191
 BasicMinimizer.h:192
 BasicMinimizer.h:193
 BasicMinimizer.h:194
 BasicMinimizer.h:195
 BasicMinimizer.h:196
 BasicMinimizer.h:197
 BasicMinimizer.h:198
 BasicMinimizer.h:199
 BasicMinimizer.h:200
 BasicMinimizer.h:201
 BasicMinimizer.h:202
 BasicMinimizer.h:203
 BasicMinimizer.h:204
 BasicMinimizer.h:205
 BasicMinimizer.h:206
 BasicMinimizer.h:207