SimplexSeedGenerator.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: SimplexSeedGenerator.cxx 20880 2007-11-19 11:23:41Z rdm $
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/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    // create starting state for Simplex, which corresponds to the initial parameter values  
00025    // using the simple Initial gradient calculator (does not use any FCN function calls)
00026    unsigned int n = st.VariableParameters();
00027    const MnMachinePrecision& prec = st.Precision();
00028    
00029    // initial starting values
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    // base class interface
00049    return (*this)(fcn, (const GradientCalculator&)(gc), st, stra);
00050 }
00051 
00052    }  // namespace Minuit2
00053 
00054 }  // namespace ROOT

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