00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Minuit2/CombinedMinimumBuilder.h"
00011 #include "Minuit2/FunctionMinimum.h"
00012 #include "Minuit2/MnStrategy.h"
00013
00014 #if defined(DEBUG) || defined(WARNINGMSG)
00015 #include "Minuit2/MnPrint.h"
00016 #endif
00017
00018
00019 namespace ROOT {
00020
00021 namespace Minuit2 {
00022
00023
00024 FunctionMinimum CombinedMinimumBuilder::Minimum(const MnFcn& fcn, const GradientCalculator& gc, const MinimumSeed& seed, const MnStrategy& strategy, unsigned int maxfcn, double edmval) const {
00025
00026
00027
00028 FunctionMinimum min = fVMMinimizer.Minimize(fcn, gc, seed, strategy, maxfcn, edmval);
00029
00030 if(!min.IsValid()) {
00031 #ifdef WARNINGMSG
00032 MN_INFO_MSG("CombinedMinimumBuilder: migrad method fails, will try with simplex method first.");
00033 #endif
00034 MnStrategy str(2);
00035 FunctionMinimum min1 = fSimplexMinimizer.Minimize(fcn, gc, seed, str, maxfcn, edmval);
00036 if(!min1.IsValid()) {
00037 #ifdef WARNINGMSG
00038 MN_INFO_MSG("CombinedMinimumBuilder: both migrad and simplex method fail.");
00039 #endif
00040 return min1;
00041 }
00042 MinimumSeed seed1 = fVMMinimizer.SeedGenerator()(fcn, gc, min1.UserState(), str);
00043
00044 FunctionMinimum min2 = fVMMinimizer.Minimize(fcn, gc, seed1, str, maxfcn, edmval);
00045 if(!min2.IsValid()) {
00046 #ifdef WARNINGMSG
00047 MN_INFO_MSG("CombinedMinimumBuilder: both migrad and method fails also at 2nd attempt.");
00048 MN_INFO_MSG("CombinedMinimumBuilder: return simplex Minimum.");
00049 #endif
00050 return min1;
00051 }
00052
00053 return min2;
00054 }
00055
00056 return min;
00057 }
00058
00059 }
00060
00061 }