00001
00002
00003
00004
00005
00006
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
00028
00029
00030
00031
00032
00033
00034 class BasicFunctionMinimum {
00035
00036 public:
00037
00038 class MnReachedCallLimit {};
00039 class MnAboveMaxEdm {};
00040
00041 public:
00042
00043
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
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
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
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
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
00071 void Add(const MinimumState& state) {
00072 fStates.push_back(state);
00073
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
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 ) {
00102 StackAllocatorHolder::Get().Deallocate(p);
00103 }
00104
00105
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
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 }
00145
00146 }
00147
00148 #endif // ROOT_Minuit2_BasicFunctionMinimum