00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Minuit2/SimplexSeedGenerator.h"
00011 #include "Minuit2/MnUserParameterState.h"
00012 #include "Minuit2/MnFcn.h"
00013 #include "Minuit2/MinimumSeed.h"
00014 #include "Minuit2/MnStrategy.h"
00015 #include "Minuit2/InitialGradientCalculator.h"
00016 #include "Minuit2/VariableMetricEDMEstimator.h"
00017
00018 namespace ROOT {
00019
00020 namespace Minuit2 {
00021
00022
00023 MinimumSeed SimplexSeedGenerator::operator()(const MnFcn& fcn, const GradientCalculator&, const MnUserParameterState& st, const MnStrategy& stra) const {
00024
00025
00026 unsigned int n = st.VariableParameters();
00027 const MnMachinePrecision& prec = st.Precision();
00028
00029
00030 MnAlgebraicVector x(n);
00031 for(unsigned int i = 0; i < n; i++) x(i) = st.IntParameters()[i];
00032 double fcnmin = fcn(x);
00033 MinimumParameters pa(x, fcnmin);
00034 InitialGradientCalculator igc(fcn, st.Trafo(), stra);
00035 FunctionGradient dgrad = igc(pa);
00036 MnAlgebraicSymMatrix mat(n);
00037 double dcovar = 1.;
00038 for(unsigned int i = 0; i < n; i++)
00039 mat(i,i) = (fabs(dgrad.G2()(i)) > prec.Eps2() ? 1./dgrad.G2()(i) : 1.);
00040 MinimumError err(mat, dcovar);
00041 double edm = VariableMetricEDMEstimator().Estimate(dgrad, err);
00042 MinimumState state(pa, err, dgrad, edm, fcn.NumOfCalls());
00043
00044 return MinimumSeed(state, st.Trafo());
00045 }
00046
00047 MinimumSeed SimplexSeedGenerator::operator()(const MnFcn& fcn, const AnalyticalGradientCalculator& gc, const MnUserParameterState& st, const MnStrategy& stra) const {
00048
00049 return (*this)(fcn, (const GradientCalculator&)(gc), st, stra);
00050 }
00051
00052 }
00053
00054 }