MnApplication.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: MnApplication.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/MnApplication.h"
00011 #include "Minuit2/FunctionMinimum.h"
00012 #include "Minuit2/ModularFunctionMinimizer.h"
00013 #include "Minuit2/FCNGradientBase.h"
00014 
00015 
00016 #ifdef DEBUG
00017 #include "Minuit2/MnPrint.h" 
00018 #endif
00019 
00020 namespace ROOT {
00021 
00022    namespace Minuit2 {
00023 
00024 
00025 // constructor from non-gradient functions
00026 MnApplication::MnApplication(const FCNBase& fcn, const MnUserParameterState& state, const MnStrategy& stra, unsigned int nfcn) : 
00027    fFCN(fcn), fState(state), fStrategy(stra), fNumCall(nfcn), fUseGrad(false) 
00028 {}
00029 
00030 // constructor from functions
00031 MnApplication::MnApplication(const FCNGradientBase& fcn, const MnUserParameterState& state, const MnStrategy& stra, unsigned int nfcn) : 
00032    fFCN(fcn), fState(state), fStrategy(stra), fNumCall(nfcn), fUseGrad(true) 
00033 {}
00034 
00035 
00036 FunctionMinimum MnApplication::operator()(unsigned int maxfcn, double toler) {
00037    // constructor from macfcn calls and tolerance 
00038    
00039    assert(fState.IsValid());
00040    unsigned int npar = VariableParameters();
00041    //   assert(npar > 0);
00042    if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
00043 
00044    const FCNBase * fcn = &(Fcnbase()); 
00045    if (fUseGrad) {
00046       // case of Gradient FCN implemented via the FCNGradientBase interface
00047       const FCNGradientBase * gfcn = dynamic_cast<const FCNGradientBase *>(fcn);
00048       assert (gfcn != 0);
00049       // case of gradient
00050       FunctionMinimum min = Minimizer().Minimize( *gfcn, fState, fStrategy, maxfcn, toler);
00051       fNumCall += min.NFcn();
00052       fState = min.UserState();
00053       return min;
00054    }
00055    else { 
00056       // no gradient
00057       FunctionMinimum min = Minimizer().Minimize( *fcn, fState, fStrategy, maxfcn, toler);
00058       fNumCall += min.NFcn();
00059       fState = min.UserState();
00060 
00061 #ifdef DEBUG
00062 //       std::cout << "Initial MIGRAD state is " << MnUserParameterState( min.States()[0], min.Up(), min.Seed().Trafo() ) << std::endl;
00063       std::cout << "State resulting from Migrad. Total Function calls  " << fNumCall  << fState << std::endl;  
00064       const std::vector<ROOT::Minuit2::MinimumState>& iterationStates =  min.States();
00065       std::cout << "Number of iterations " << iterationStates.size() << std::endl;
00066       for (unsigned int i = 0; i <  iterationStates.size(); ++i) {
00067          //std::cout << iterationStates[i] << std::endl;
00068          const ROOT::Minuit2::MinimumState & st =  iterationStates[i];
00069          std::cout << "----------> Iteration " << i << std::endl;
00070          int pr = std::cout.precision(18);
00071          std::cout << "            FVAL = " << st.Fval() 
00072                    << " Edm = " << st.Edm() << " Nfcn = " << st.NFcn() << std::endl;
00073          std::cout.precision(pr);
00074          std::cout << "            Error matrix change = " << st.Error().Dcovar() 
00075                    << std::endl;
00076          std::cout << "            Internal parameters : ";
00077          for (int j = 0; j < st.size() ; ++j) 
00078             std::cout << " p" << j << " = " << st.Vec()(j);
00079          std::cout << std::endl;
00080       }
00081 #endif
00082 
00083       return min;
00084    }
00085 
00086 }
00087 
00088 // facade: forward interface of MnUserParameters and MnUserTransformation
00089 // via MnUserParameterState
00090 
00091 
00092 const std::vector<MinuitParameter>& MnApplication::MinuitParameters() const {
00093    //access to parameters (row-wise)
00094    return fState.MinuitParameters();
00095 }
00096 //access to parameters and errors in column-wise representation 
00097 std::vector<double> MnApplication::Params() const {return fState.Params();}
00098 std::vector<double> MnApplication::Errors() const {return fState.Errors();}
00099 
00100 
00101 const MinuitParameter& MnApplication::Parameter(unsigned int i) const {
00102    //access to single Parameter
00103    return fState.Parameter(i);
00104 }
00105 
00106 
00107 void MnApplication::Add(const char* name, double val, double err) {
00108    //add free Parameter
00109    fState.Add(name, val, err);
00110 }
00111 
00112 void MnApplication::Add(const char* name, double val, double err, double low, double up) {
00113    //add limited Parameter 
00114    fState.Add(name, val, err, low, up);
00115 }
00116 
00117 void MnApplication::Add(const char* name, double val) {
00118    //add const Parameter
00119    fState.Add(name, val);
00120 }
00121 
00122 //interaction via external number of Parameter
00123 void MnApplication::Fix(unsigned int i) {fState.Fix(i);}
00124 void MnApplication::Release(unsigned int i) {fState.Release(i);}
00125 void MnApplication::SetValue(unsigned int i, double val) {
00126    // set value for parameter i 
00127    fState.SetValue(i, val);
00128 }
00129 void MnApplication::SetError(unsigned int i, double val) {
00130    // set parameter error
00131    fState.SetError(i, val);
00132 }
00133 void MnApplication::SetLimits(unsigned int i, double low, double up) {
00134    // set parameter limits
00135    fState.SetLimits(i, low, up);
00136 }
00137 void MnApplication::RemoveLimits(unsigned int i) {fState.RemoveLimits(i);}
00138 
00139 double MnApplication::Value(unsigned int i) const {return fState.Value(i);}
00140 double MnApplication::Error(unsigned int i) const {return fState.Error(i);}
00141 
00142 //interaction via Name of Parameter
00143 void MnApplication::Fix(const char* i) {fState.Fix(i);}
00144 void MnApplication::Release(const char* i) {fState.Release(i);}
00145 void MnApplication::SetValue(const char* i, double val) {fState.SetValue(i, val);}
00146 void MnApplication::SetError(const char* i, double val) {fState.SetError(i, val);}
00147 void MnApplication::SetLimits(const char* i, double low, double up) { fState.SetLimits(i, low, up);}
00148 void MnApplication::RemoveLimits(const char* i) {fState.RemoveLimits(i);}
00149 void MnApplication::SetPrecision(double eps) {fState.SetPrecision(eps);}
00150 
00151 double MnApplication::Value(const char* i) const {return fState.Value(i);}
00152 double MnApplication::Error(const char* i) const {return fState.Error(i);}
00153 
00154 
00155 unsigned int MnApplication::Index(const char* name) const {
00156    //convert name into external number of Parameter
00157    return fState.Index(name);
00158 }
00159 
00160 const char* MnApplication::Name(unsigned int i) const {
00161    //convert external number into name of Parameter
00162    return fState.Name(i);
00163 }
00164 
00165 
00166 double MnApplication::Int2ext(unsigned int i, double val) const {
00167    // transformation internal -> external
00168    return fState.Int2ext(i, val);
00169 }
00170 double MnApplication::Ext2int(unsigned int e, double val) const {
00171    // transformation external -> internal
00172    return fState.Ext2int(e, val);
00173 }
00174 unsigned int MnApplication::IntOfExt(unsigned int ext) const {
00175    // get internal index for external parameter with index ext
00176    return fState.IntOfExt(ext);
00177 }
00178 unsigned int MnApplication::ExtOfInt(unsigned int internal) const { 
00179    // get external index for internal parameter with index internal
00180    return fState.ExtOfInt(internal);
00181 }
00182 unsigned int MnApplication::VariableParameters() const {
00183    // get number of variable parameters
00184    return fState.VariableParameters();
00185 }
00186 
00187 
00188    }  // namespace Minuit2
00189 
00190 }  // namespace ROOT

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