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