00001
00002
00003
00004
00005
00006
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
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
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
00045
00046 MnUserParameterState st(par, err);
00047 MnStrategy strategy(stra);
00048 return Minimize(fcn, st, strategy, maxfcn, toler);
00049 }
00050
00051
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
00054
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
00063
00064
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
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
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
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
00094
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
00104
00105
00106
00107
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
00120 FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00121
00122
00123
00124
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
00140
00141
00142 const MinimumBuilder & mb = Builder();
00143
00144 double effective_toler = toler * mfcn.Up();
00145
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 }
00155
00156 }