00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Minuit2/MnConfig.h"
00011 #include "Minuit2/FumiliMinimizer.h"
00012 #include "Minuit2/MinimumSeedGenerator.h"
00013 #include "Minuit2/FumiliGradientCalculator.h"
00014 #include "Minuit2/Numerical2PGradientCalculator.h"
00015 #include "Minuit2/AnalyticalGradientCalculator.h"
00016 #include "Minuit2/MinimumBuilder.h"
00017 #include "Minuit2/MinimumSeed.h"
00018 #include "Minuit2/FunctionMinimum.h"
00019 #include "Minuit2/MnUserParameterState.h"
00020 #include "Minuit2/MnUserParameters.h"
00021 #include "Minuit2/MnUserTransformation.h"
00022 #include "Minuit2/MnUserFcn.h"
00023 #include "Minuit2/FumiliFCNBase.h"
00024 #include "Minuit2/FumiliFCNBase.h"
00025 #include "Minuit2/FumiliGradientCalculator.h"
00026 #include "Minuit2/FCNGradientBase.h"
00027 #include "Minuit2/MnStrategy.h"
00028 #include "Minuit2/MnPrint.h"
00029
00030 namespace ROOT {
00031
00032 namespace Minuit2 {
00033
00034
00035
00036
00037
00038 FunctionMinimum FumiliMinimizer::Minimize(const FCNBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00039
00040
00041
00042 MnUserFcn mfcn(fcn, st.Trafo());
00043 Numerical2PGradientCalculator gc(mfcn, st.Trafo(), strategy);
00044
00045 unsigned int npar = st.VariableParameters();
00046 if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
00047
00048 maxfcn = int(0.1*maxfcn);
00049
00050 MinimumSeed mnseeds = SeedGenerator()(mfcn, gc, st, strategy);
00051
00052
00053
00054
00055
00056 FumiliFCNBase * fumiliFcn = dynamic_cast< FumiliFCNBase *>( const_cast<FCNBase *>(&fcn) );
00057 if ( !fumiliFcn ) {
00058 MN_ERROR_MSG("FumiliMinimizer: Error : wrong FCN type. Try to use default minimizer");
00059 return FunctionMinimum(mnseeds, fcn.Up() );
00060 }
00061
00062
00063 FumiliGradientCalculator fgc(*fumiliFcn, st.Trafo(), npar);
00064 #ifdef DEBUG
00065 std::cout << "Minuit::Minimize using FumiliMinimizer" << std::endl;
00066 #endif
00067 return ModularFunctionMinimizer::Minimize(mfcn, fgc, mnseeds, strategy, maxfcn, toler);
00068 }
00069
00070
00071
00072 FunctionMinimum FumiliMinimizer::Minimize(const FCNGradientBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00073
00074
00075
00076
00077 MnUserFcn mfcn(fcn, st.Trafo() );
00078 AnalyticalGradientCalculator gc(fcn, st.Trafo());
00079
00080 unsigned int npar = st.VariableParameters();
00081 if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
00082
00083 MinimumSeed mnseeds = SeedGenerator()(mfcn, gc, st, strategy);
00084
00085
00086
00087 FumiliFCNBase * fumiliFcn = dynamic_cast< FumiliFCNBase *>( const_cast<FCNGradientBase *>(&fcn) );
00088 if ( !fumiliFcn ) {
00089 MN_ERROR_MSG("FumiliMinimizer: Error : wrong FCN type. Try to use default minimizer");
00090 return FunctionMinimum(mnseeds, fcn.Up() );
00091 }
00092
00093
00094 FumiliGradientCalculator fgc(*fumiliFcn, st.Trafo(), npar);
00095 #ifdef DEBUG
00096 std::cout << "Minuit::Minimize using FumiliMinimizer" << std::endl;
00097 #endif
00098 return ModularFunctionMinimizer::Minimize(mfcn, fgc, mnseeds, strategy, maxfcn, toler);
00099
00100 }
00101
00102 }
00103
00104 }