FumiliMinimizer.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: FumiliMinimizer.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/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 // for Fumili implement Minimize here because need downcast 
00036 
00037       
00038 FunctionMinimum FumiliMinimizer::Minimize(const FCNBase& fcn, const MnUserParameterState& st, const MnStrategy& strategy, unsigned int maxfcn, double toler) const {
00039    // Minimize using Fumili. Create seed and Fumili gradient calculator. 
00040    // The FCNBase passed must be a FumiliFCNBase type otherwise method will fail !
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    //FUMILI needs much less function calls
00048    maxfcn = int(0.1*maxfcn); 
00049    
00050    MinimumSeed mnseeds = SeedGenerator()(mfcn, gc, st, strategy);
00051    
00052    // downcast fcn 
00053    
00054    //std::cout << "FCN type " << typeid(&fcn).Name() << std::endl;
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    // Minimize using Fumili. Case of interface is a FCNGradientBase. 
00074    // Normally other method is used  - probably this could be removed (t.b.i.)
00075    
00076    // need MnUserFcn
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    // downcast fcn 
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    }  // namespace Minuit2
00103 
00104 }  // namespace ROOT

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