BasicFunctionMinimum.h

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: BasicFunctionMinimum.h 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 #ifndef ROOT_Minuit2_BasicFunctionMinimum
00011 #define ROOT_Minuit2_BasicFunctionMinimum
00012 
00013 #include "Minuit2/MinimumSeed.h"
00014 #include "Minuit2/MinimumState.h"
00015 #include "Minuit2/MnUserParameterState.h"
00016 #include "Minuit2/MnUserTransformation.h"
00017 
00018 #include "Minuit2/StackAllocator.h"
00019 
00020 #include <vector>
00021 
00022 namespace ROOT {
00023 
00024    namespace Minuit2 {
00025 
00026 
00027 //extern StackAllocator gStackAllocator;
00028 
00029 /** result of the minimization; 
00030     both internal and external (MnUserParameterState) representation available
00031     For the parameters at the Minimum
00032  */
00033 
00034 class BasicFunctionMinimum {
00035 
00036 public:
00037 
00038    class MnReachedCallLimit {};
00039    class MnAboveMaxEdm {};
00040 
00041 public:
00042    
00043    /// constructor from only MinimumSeed. Minimum is only from seed result not the full minimization 
00044    BasicFunctionMinimum(const MinimumSeed& seed, double up) : fSeed(seed), fStates(std::vector<MinimumState>(1, MinimumState(seed.Parameters(), seed.Error(), seed.Gradient(), seed.Parameters().Fval(), seed.NFcn()))), fErrorDef(up), fAboveMaxEdm(false), fReachedCallLimit(false), fUserState(MnUserParameterState()) {}
00045   
00046    /// constructor at the end of a successfull minimization from seed and vector of states 
00047    BasicFunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up) : fSeed(seed), fStates(states), fErrorDef(up), fAboveMaxEdm(false), fReachedCallLimit(false), fUserState(MnUserParameterState()) {}
00048   
00049    /// constructor at the end of a failed minimization due to exceeding function call limit 
00050    BasicFunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up, MnReachedCallLimit) : fSeed(seed), fStates(states), fErrorDef(up), fAboveMaxEdm(false), fReachedCallLimit(true), fUserState(MnUserParameterState()) {}
00051   
00052    /// constructor at the end of a failed minimization due to edm above maximum value
00053    BasicFunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up, MnAboveMaxEdm) : fSeed(seed), fStates(states), fErrorDef(up), fAboveMaxEdm(true), fReachedCallLimit(false), fUserState(MnUserParameterState()) {}
00054 
00055    /// copy constructor
00056    BasicFunctionMinimum(const BasicFunctionMinimum& min) : fSeed(min.fSeed), fStates(min.fStates), fErrorDef(min.fErrorDef), fAboveMaxEdm(min.fAboveMaxEdm), fReachedCallLimit(min.fReachedCallLimit), fUserState(min.fUserState) {}
00057   
00058    BasicFunctionMinimum& operator=(const BasicFunctionMinimum& min) {
00059       fSeed = min.fSeed;
00060       fStates = min.fStates;
00061       fErrorDef = min.fErrorDef;
00062       fAboveMaxEdm = min.fAboveMaxEdm;
00063       fReachedCallLimit = min.fReachedCallLimit;
00064       fUserState = min.fUserState;
00065       return *this;
00066    }
00067 
00068    ~BasicFunctionMinimum() {}
00069 
00070    /// add latest minimization state (for example add Hesse result after Migrad)
00071    void Add(const MinimumState& state) {
00072       fStates.push_back(state);
00073       // LM : update also the user state 
00074       fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
00075    }
00076 
00077    const MinimumSeed& Seed() const {return fSeed;}
00078    const std::vector<MinimumState>& States() const {return fStates;}
00079 
00080 // user representation of state at Minimum
00081    const MnUserParameterState& UserState() const {
00082       if(!fUserState.IsValid()) 
00083          fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
00084       return fUserState;
00085    }
00086    const MnUserParameters& UserParameters() const {
00087       if(!fUserState.IsValid()) 
00088          fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
00089       return fUserState.Parameters();
00090    }
00091    const MnUserCovariance& UserCovariance() const {
00092       if(!fUserState.IsValid()) 
00093          fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
00094       return fUserState.Covariance();
00095    }
00096 
00097    void* operator new(size_t nbytes) {
00098       return StackAllocatorHolder::Get().Allocate(nbytes);
00099    }
00100   
00101    void operator delete(void* p, size_t /*nbytes */) {
00102       StackAllocatorHolder::Get().Deallocate(p);
00103    }
00104 
00105    // forward interface of last state
00106    const MinimumState& State() const {return fStates.back();}
00107    const MinimumParameters& Parameters() const {return fStates.back().Parameters();}
00108    const MinimumError& Error() const {return fStates.back().Error();}
00109    const FunctionGradient& Grad() const {return fStates.back().Gradient();}
00110    double Fval() const {return fStates.back().Fval();}
00111    double Edm() const {return fStates.back().Edm();}
00112    int NFcn() const {return fStates.back().NFcn();}  
00113   
00114    double Up() const {return fErrorDef;}
00115    bool IsValid() const {
00116       return State().IsValid() && !IsAboveMaxEdm() && !HasReachedCallLimit();
00117    }
00118    bool HasValidParameters() const {return State().Parameters().IsValid();}
00119    bool HasValidCovariance() const {return State().Error().IsValid();}
00120    bool HasAccurateCovar() const {return State().Error().IsAccurate();}
00121    bool HasPosDefCovar() const {return State().Error().IsPosDef();}
00122    bool HasMadePosDefCovar() const {return State().Error().IsMadePosDef();}
00123    bool HesseFailed() const {return State().Error().HesseFailed();}
00124    bool HasCovariance() const {return State().Error().IsAvailable();}
00125    bool IsAboveMaxEdm() const {return fAboveMaxEdm;}
00126    bool HasReachedCallLimit() const {return fReachedCallLimit;}
00127 
00128    void SetErrorDef( double up) { 
00129       fErrorDef = up; 
00130       // update user state for new valeu of up (scaling of errors)
00131       fUserState = MnUserParameterState(State(), up, Seed().Trafo());
00132    }
00133 
00134 private:
00135 
00136    MinimumSeed fSeed;
00137    std::vector<MinimumState> fStates;
00138    double fErrorDef;
00139    bool fAboveMaxEdm;
00140    bool fReachedCallLimit;
00141    mutable MnUserParameterState fUserState;
00142 };
00143 
00144   }  // namespace Minuit2
00145 
00146 }  // namespace ROOT
00147 
00148 #endif  // ROOT_Minuit2_BasicFunctionMinimum

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