00001
00002
00003
00004
00005
00006
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
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
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
00038
00039 assert(fState.IsValid());
00040 unsigned int npar = VariableParameters();
00041
00042 if(maxfcn == 0) maxfcn = 200 + 100*npar + 5*npar*npar;
00043
00044 const FCNBase * fcn = &(Fcnbase());
00045 if (fUseGrad) {
00046
00047 const FCNGradientBase * gfcn = dynamic_cast<const FCNGradientBase *>(fcn);
00048 assert (gfcn != 0);
00049
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
00057 FunctionMinimum min = Minimizer().Minimize( *fcn, fState, fStrategy, maxfcn, toler);
00058 fNumCall += min.NFcn();
00059 fState = min.UserState();
00060
00061 #ifdef DEBUG
00062
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
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
00089
00090
00091
00092 const std::vector<MinuitParameter>& MnApplication::MinuitParameters() const {
00093
00094 return fState.MinuitParameters();
00095 }
00096
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
00103 return fState.Parameter(i);
00104 }
00105
00106
00107 void MnApplication::Add(const char* name, double val, double err) {
00108
00109 fState.Add(name, val, err);
00110 }
00111
00112 void MnApplication::Add(const char* name, double val, double err, double low, double up) {
00113
00114 fState.Add(name, val, err, low, up);
00115 }
00116
00117 void MnApplication::Add(const char* name, double val) {
00118
00119 fState.Add(name, val);
00120 }
00121
00122
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
00127 fState.SetValue(i, val);
00128 }
00129 void MnApplication::SetError(unsigned int i, double val) {
00130
00131 fState.SetError(i, val);
00132 }
00133 void MnApplication::SetLimits(unsigned int i, double low, double up) {
00134
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
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
00157 return fState.Index(name);
00158 }
00159
00160 const char* MnApplication::Name(unsigned int i) const {
00161
00162 return fState.Name(i);
00163 }
00164
00165
00166 double MnApplication::Int2ext(unsigned int i, double val) const {
00167
00168 return fState.Int2ext(i, val);
00169 }
00170 double MnApplication::Ext2int(unsigned int e, double val) const {
00171
00172 return fState.Ext2int(e, val);
00173 }
00174 unsigned int MnApplication::IntOfExt(unsigned int ext) const {
00175
00176 return fState.IntOfExt(ext);
00177 }
00178 unsigned int MnApplication::ExtOfInt(unsigned int internal) const {
00179
00180 return fState.ExtOfInt(internal);
00181 }
00182 unsigned int MnApplication::VariableParameters() const {
00183
00184 return fState.VariableParameters();
00185 }
00186
00187
00188 }
00189
00190 }