ModularFunctionMinimizer.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: ModularFunctionMinimizer.cxx 23654 2008-05-06 07:30:34Z moneta $
00002 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005  
00003 
00004 /**********************************************************************
00005  *                                                                    *
00006  * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
00007  *                                                                    *
00008  **********************************************************************/
00009 
00010 #include "Minuit2/ModularFunctionMinimizer.h"
00011 #include "Minuit2/MinimumSeedGenerator.h"
00012 #include "Minuit2/AnalyticalGradientCalculator.h"
00013 #include "Minuit2/Numerical2PGradientCalculator.h"
00014 #include "Minuit2/MinimumBuilder.h"
00015 #include "Minuit2/MinimumSeed.h"
00016 #include "Minuit2/FunctionMinimum.h"
00017 #include "Minuit2/MnUserParameterState.h"
00018 #include "Minuit2/MnUserParameters.h"
00019 #include "Minuit2/MnUserCovariance.h"
00020 #include "Minuit2/MnUserTransformation.h"
00021 #include "Minuit2/MnUserFcn.h"
00022 #include "Minuit2/FCNBase.h"
00023 #include "Minuit2/FCNGradientBase.h"
00024 #include "Minuit2/MnStrategy.h"
00025 #include "Minuit2/MnHesse.h"
00026 #include "Minuit2/MnLineSearch.h"
00027 #include "Minuit2/MnParabolaPoint.h"
00028 
00029 namespace ROOT {
00030 
00031    namespace Minuit2 {
00032 
00033 
00034 // #include "Minuit2/MnUserParametersPrint.h"
00035 
00036 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra, unsigned int maxfcn, double toler) const {
00037    // minimize from FCNBase and std::vector of double's for parameter values and errors (step sizes)
00038    MnUserParameterState st(par, err);
00039    MnStrategy strategy(stra);
00040    return Minimize(fcn, st, strategy, maxfcn, toler);
00041 }
00042 
00043 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const std::vector<double>& par, const std::vector<double>& err, unsigned int stra, unsigned int maxfcn, double toler) const {
00044    // minimize from FCNGradientBase (use analytical gradient provided in FCN) 
00045    // and std::vector of double's for parameter values and errors (step sizes)
00046    MnUserParameterState st(par, err);
00047    MnStrategy strategy(stra);
00048    return Minimize(fcn, st, strategy, maxfcn, toler);
00049 }
00050 
00051 // move nrow before cov to avoid ambiguities when using default parameters
00052 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov, unsigned int stra, unsigned int maxfcn, double toler) const {
00053    // minimize from FCNBase using std::vector for parameter error and    
00054    // an std::vector of size n*(n+1)/2 for the covariance matrix  and n (rank of cov matrix) 
00055    
00056    MnUserParameterState st(par, cov, nrow);
00057    MnStrategy strategy(stra);
00058    return Minimize(fcn, st, strategy, maxfcn, toler);
00059 }
00060 
00061 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const std::vector<double>& par, unsigned int nrow, const std::vector<double>& cov, unsigned int stra, unsigned int maxfcn, double toler) const {
00062    // minimize from FCNGradientBase (use analytical gradient provided in FCN) 
00063    // using std::vector for parameter error and    
00064    // an std::vector of size n*(n+1)/2 for the covariance matrix  and n (rank of cov matrix) 
00065 
00066    MnUserParameterState st(par, cov, nrow);
00067    MnStrategy strategy(stra);
00068    return Minimize(fcn, st, strategy, maxfcn, toler);
00069 }
00070 
00071 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const MnUserParameters& upar, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00072    // minimize from FCNBase and MnUserParameters object
00073    
00074    MnUserParameterState st(upar);
00075    return Minimize(fcn, st, strategy, maxfcn, toler);
00076 }
00077 
00078 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const MnUserParameters& upar, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00079    // minimize from FCNGradientBase (use analytical gradient provided in FCN)  and MnUserParameters object
00080    
00081    MnUserParameterState st(upar);
00082    return Minimize(fcn, st, strategy, maxfcn, toler);
00083 }
00084 
00085 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const MnUserParameters& upar, const MnUserCovariance& cov, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00086    // minimize from FCNBase and MnUserParameters and MnUserCovariance objects
00087    
00088    MnUserParameterState st(upar, cov);
00089    return Minimize(fcn, st, strategy, maxfcn, toler);
00090 }
00091 
00092 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const MnUserParameters& upar, const MnUserCovariance& cov, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00093    // minimize from FCNGradientBase (use analytical gradient provided in FCN)  and 
00094    // MnUserParameters MnUserCovariance objects
00095 
00096    MnUserParameterState st(upar, cov);
00097    return Minimize(fcn, st, strategy, maxfcn, toler);
00098 }
00099 
00100 
00101 
00102 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00103    // minimize from a FCNBase and a MnUserparameterState - interface used by all the previous ones 
00104    // based on FCNBase. Create in this case a NumericalGradient calculator
00105    // Create the minuit FCN wrapper (MnUserFcn) containing the trasformation (int<->ext)
00106    
00107    // neeed MnUsserFcn for difference int-ext parameters
00108    MnUserFcn mfcn(fcn, st.Trafo() );
00109    Numerical2PGradientCalculator gc(mfcn, st.Trafo(), strategy);
00110    
00111    unsigned int npar = st.VariableParameters();
00112    if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
00113    MinimumSeed mnseeds = SeedGenerator()(mfcn, gc, st, strategy);
00114    
00115    return Minimize(mfcn, gc, mnseeds, strategy, maxfcn, toler);
00116 }
00117 
00118 
00119 // use Gradient here 
00120 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00121    // minimize from a FCNGradientBase and a MnUserparameterState - interface used by all the previous ones 
00122    // based on FCNGradientBase. 
00123    // Create in this acase an AnalyticalGradient calculator
00124    // Create the minuit FCN wrapper (MnUserFcn) containing the trasformation (int<->ext)
00125    
00126    MnUserFcn mfcn(fcn, st.Trafo());
00127    AnalyticalGradientCalculator gc(fcn, st.Trafo());
00128    
00129    unsigned int npar = st.VariableParameters();
00130    if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
00131    
00132    MinimumSeed mnseeds = SeedGenerator()(mfcn, gc, st, strategy);
00133    
00134    return Minimize(mfcn, gc, mnseeds, strategy, maxfcn, toler);
00135 }
00136 
00137 
00138 FunctionMinimum ModularFunctionMinimizer::Minimize(const MnFcn& mfcn, const GradientCalculator& gc, const MinimumSeed& seed, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00139    // Interface used by all the others for the minimization using the base MinimumBuilder class
00140    // According to the contained type of MinimumBuilder the right type will be used
00141    
00142    const MinimumBuilder & mb = Builder();
00143    //std::cout << typeid(&mb).Name() << std::endl;
00144    double effective_toler = toler * mfcn.Up(); 
00145    // avoid tolerance too smalls (than limits)
00146    double eps = MnMachinePrecision().Eps2(); 
00147    if (effective_toler < eps) effective_toler = eps; 
00148    return mb.Minimum(mfcn, gc, seed, strategy, maxfcn, effective_toler);
00149 }
00150 
00151 
00152 
00153 
00154    }  // namespace Minuit2
00155 
00156 }  // namespace ROOT

Generated on Tue Jul 5 14:37:11 2011 for ROOT_528-00b_version by  doxygen 1.5.1