10 #ifndef ROOT_Minuit2_BasicFunctionMinimum
11 #define ROOT_Minuit2_BasicFunctionMinimum
34 class BasicFunctionMinimum {
38 class MnReachedCallLimit {};
39 class MnAboveMaxEdm {};
44 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()) {}
47 BasicFunctionMinimum(
const MinimumSeed& seed,
const std::vector<MinimumState>& states,
double up) : fSeed(seed), fStates(states), fErrorDef(up), fAboveMaxEdm(false), fReachedCallLimit(false), fUserState(MnUserParameterState()) {}
50 BasicFunctionMinimum(
const MinimumSeed& seed,
const std::vector<MinimumState>& states,
double up, MnReachedCallLimit) : fSeed(seed), fStates(states), fErrorDef(up), fAboveMaxEdm(false), fReachedCallLimit(true), fUserState(MnUserParameterState()) {}
53 BasicFunctionMinimum(
const MinimumSeed& seed,
const std::vector<MinimumState>& states,
double up, MnAboveMaxEdm) : fSeed(seed), fStates(states), fErrorDef(up), fAboveMaxEdm(true), fReachedCallLimit(false), fUserState(MnUserParameterState()) {}
56 BasicFunctionMinimum(
const BasicFunctionMinimum& min) : fSeed(min.fSeed), fStates(min.fStates), fErrorDef(min.fErrorDef), fAboveMaxEdm(min.fAboveMaxEdm), fReachedCallLimit(min.fReachedCallLimit), fUserState(min.fUserState) {}
58 BasicFunctionMinimum& operator=(
const BasicFunctionMinimum& min) {
60 fStates = min.fStates;
61 fErrorDef = min.fErrorDef;
62 fAboveMaxEdm = min.fAboveMaxEdm;
63 fReachedCallLimit = min.fReachedCallLimit;
64 fUserState = min.fUserState;
68 ~BasicFunctionMinimum() {}
71 void Add(
const MinimumState& state ) {
72 fStates.push_back(state);
74 fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
80 void Add(
const MinimumState& state, MnAboveMaxEdm) {
85 const MinimumSeed& Seed()
const {
return fSeed;}
86 const std::vector<MinimumState>& States()
const {
return fStates;}
89 const MnUserParameterState& UserState()
const {
90 if(!fUserState.IsValid())
91 fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
94 const MnUserParameters& UserParameters()
const {
95 if(!fUserState.IsValid())
96 fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
97 return fUserState.Parameters();
99 const MnUserCovariance& UserCovariance()
const {
100 if(!fUserState.IsValid())
101 fUserState = MnUserParameterState(State(), Up(), Seed().Trafo());
102 return fUserState.Covariance();
105 void*
operator new(
size_t nbytes) {
106 return StackAllocatorHolder::Get().Allocate(nbytes);
109 void operator delete(
void* p,
size_t ) {
110 StackAllocatorHolder::Get().Deallocate(p);
114 const MinimumState& State()
const {
return fStates.back();}
115 const MinimumParameters& Parameters()
const {
return fStates.back().Parameters();}
116 const MinimumError& Error()
const {
return fStates.back().Error();}
117 const FunctionGradient& Grad()
const {
return fStates.back().Gradient();}
118 double Fval()
const {
return fStates.back().Fval();}
119 double Edm()
const {
return fStates.back().Edm();}
120 int NFcn()
const {
return fStates.back().NFcn();}
122 double Up()
const {
return fErrorDef;}
123 bool IsValid()
const {
124 return State().IsValid() && !IsAboveMaxEdm() && !HasReachedCallLimit();
126 bool HasValidParameters()
const {
return State().Parameters().IsValid();}
127 bool HasValidCovariance()
const {
return State().Error().IsValid();}
128 bool HasAccurateCovar()
const {
return State().Error().IsAccurate();}
129 bool HasPosDefCovar()
const {
return State().Error().IsPosDef();}
130 bool HasMadePosDefCovar()
const {
return State().Error().IsMadePosDef();}
131 bool HesseFailed()
const {
return State().Error().HesseFailed();}
132 bool HasCovariance()
const {
return State().Error().IsAvailable();}
133 bool IsAboveMaxEdm()
const {
return fAboveMaxEdm;}
134 bool HasReachedCallLimit()
const {
return fReachedCallLimit;}
136 void SetErrorDef(
double up) {
139 fUserState = MnUserParameterState(State(), up, Seed().Trafo());
145 std::vector<MinimumState> fStates;
148 bool fReachedCallLimit;
149 mutable MnUserParameterState fUserState;
156 #endif // ROOT_Minuit2_BasicFunctionMinimum