// @(#)root/minuit2:$Id$
// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
 *                                                                    *
 **********************************************************************/

#ifndef ROOT_Minuit2_FunctionMinimum
#define ROOT_Minuit2_FunctionMinimum

#include "Minuit2/BasicFunctionMinimum.h"

#ifdef G__DICTIONARY
typedef ROOT::Minuit2::MinimumState MinimumState;
#endif

namespace ROOT {

   namespace Minuit2 {

//______________________________________________________________________________________________
/**
    class holding the full result of the minimization;
    both internal and external (MnUserParameterState) representation available
    for the parameters at the Minimum
 */

class FunctionMinimum {

public:

   class MnReachedCallLimit {};
   class MnAboveMaxEdm {};

public:


   /// constructor from only MinimumSeed. Minimum is only from seed result not full minimization
   FunctionMinimum(const MinimumSeed& seed, double up) : fData(MnRefCountedPointer<BasicFunctionMinimum>(new BasicFunctionMinimum(seed, up))) {}

   /// constructor at the end of a successfull minimization from seed and vector of states
   FunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up) : fData(MnRefCountedPointer<BasicFunctionMinimum>(new BasicFunctionMinimum(seed, states, up))) {}

   /// constructor at the end of a failed minimization due to exceeding function call limit
   FunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up, MnReachedCallLimit) : fData(MnRefCountedPointer<BasicFunctionMinimum>(new BasicFunctionMinimum(seed, states, up, BasicFunctionMinimum::MnReachedCallLimit()))) {}

   /// constructor at the end of a failed minimization due to edm above maximum value
   FunctionMinimum(const MinimumSeed& seed, const std::vector<MinimumState>& states, double up, MnAboveMaxEdm) : fData(MnRefCountedPointer<BasicFunctionMinimum>(new BasicFunctionMinimum(seed, states, up, BasicFunctionMinimum::MnAboveMaxEdm()))) {}

   /// copy constructo
   FunctionMinimum(const FunctionMinimum& min) : fData(min.fData) {}

   FunctionMinimum& operator=(const FunctionMinimum& min) {
      fData = min.fData;
      return *this;
   }

   ~FunctionMinimum() {}

   // add new state
   void Add(const MinimumState& state) {fData->Add(state);}

   // add new state
   void Add(const MinimumState& state, MnAboveMaxEdm) {fData->Add(state,BasicFunctionMinimum::MnAboveMaxEdm());}

   const MinimumSeed& Seed() const {return fData->Seed();}
   const std::vector<ROOT::Minuit2::MinimumState>& States() const {return fData->States();}

// user representation of state at Minimum
   const MnUserParameterState& UserState() const {
      return fData->UserState();
   }
   const MnUserParameters& UserParameters() const {
      return fData->UserParameters();
   }
   const MnUserCovariance& UserCovariance() const {
      return fData->UserCovariance();
   }

// forward interface of last state
   const MinimumState& State() const {return fData->State();}
   const MinimumParameters& Parameters() const {return fData->Parameters();}
   const MinimumError& Error() const {return fData->Error();}
   const FunctionGradient& Grad() const {return fData->Grad();}
   double Fval() const {return fData->Fval();}
   double Edm() const {return fData->Edm();}
   int NFcn() const {return fData->NFcn();}

   double Up() const {return fData->Up();}
   bool IsValid() const {return fData->IsValid();}
   bool HasValidParameters() const {return fData->HasValidParameters();}
   bool HasValidCovariance() const {return fData->HasValidCovariance();}
   bool HasAccurateCovar() const {return fData->HasAccurateCovar();}
   bool HasPosDefCovar() const {return fData->HasPosDefCovar();}
   bool HasMadePosDefCovar() const {return fData->HasMadePosDefCovar();}
   bool HesseFailed() const {return fData->HesseFailed();}
   bool HasCovariance() const {return fData->HasCovariance();}
   bool IsAboveMaxEdm() const {return fData->IsAboveMaxEdm();}
   bool HasReachedCallLimit() const {return fData->HasReachedCallLimit();}

   void SetErrorDef( double up) { return fData->SetErrorDef(up);}

private:

   MnRefCountedPointer<BasicFunctionMinimum> fData;
};

  }  // namespace Minuit2

}  // namespace ROOT

#endif  // ROOT_Minuit2_FunctionMinimum
 FunctionMinimum.h:1
 FunctionMinimum.h:2
 FunctionMinimum.h:3
 FunctionMinimum.h:4
 FunctionMinimum.h:5
 FunctionMinimum.h:6
 FunctionMinimum.h:7
 FunctionMinimum.h:8
 FunctionMinimum.h:9
 FunctionMinimum.h:10
 FunctionMinimum.h:11
 FunctionMinimum.h:12
 FunctionMinimum.h:13
 FunctionMinimum.h:14
 FunctionMinimum.h:15
 FunctionMinimum.h:16
 FunctionMinimum.h:17
 FunctionMinimum.h:18
 FunctionMinimum.h:19
 FunctionMinimum.h:20
 FunctionMinimum.h:21
 FunctionMinimum.h:22
 FunctionMinimum.h:23
 FunctionMinimum.h:24
 FunctionMinimum.h:25
 FunctionMinimum.h:26
 FunctionMinimum.h:27
 FunctionMinimum.h:28
 FunctionMinimum.h:29
 FunctionMinimum.h:30
 FunctionMinimum.h:31
 FunctionMinimum.h:32
 FunctionMinimum.h:33
 FunctionMinimum.h:34
 FunctionMinimum.h:35
 FunctionMinimum.h:36
 FunctionMinimum.h:37
 FunctionMinimum.h:38
 FunctionMinimum.h:39
 FunctionMinimum.h:40
 FunctionMinimum.h:41
 FunctionMinimum.h:42
 FunctionMinimum.h:43
 FunctionMinimum.h:44
 FunctionMinimum.h:45
 FunctionMinimum.h:46
 FunctionMinimum.h:47
 FunctionMinimum.h:48
 FunctionMinimum.h:49
 FunctionMinimum.h:50
 FunctionMinimum.h:51
 FunctionMinimum.h:52
 FunctionMinimum.h:53
 FunctionMinimum.h:54
 FunctionMinimum.h:55
 FunctionMinimum.h:56
 FunctionMinimum.h:57
 FunctionMinimum.h:58
 FunctionMinimum.h:59
 FunctionMinimum.h:60
 FunctionMinimum.h:61
 FunctionMinimum.h:62
 FunctionMinimum.h:63
 FunctionMinimum.h:64
 FunctionMinimum.h:65
 FunctionMinimum.h:66
 FunctionMinimum.h:67
 FunctionMinimum.h:68
 FunctionMinimum.h:69
 FunctionMinimum.h:70
 FunctionMinimum.h:71
 FunctionMinimum.h:72
 FunctionMinimum.h:73
 FunctionMinimum.h:74
 FunctionMinimum.h:75
 FunctionMinimum.h:76
 FunctionMinimum.h:77
 FunctionMinimum.h:78
 FunctionMinimum.h:79
 FunctionMinimum.h:80
 FunctionMinimum.h:81
 FunctionMinimum.h:82
 FunctionMinimum.h:83
 FunctionMinimum.h:84
 FunctionMinimum.h:85
 FunctionMinimum.h:86
 FunctionMinimum.h:87
 FunctionMinimum.h:88
 FunctionMinimum.h:89
 FunctionMinimum.h:90
 FunctionMinimum.h:91
 FunctionMinimum.h:92
 FunctionMinimum.h:93
 FunctionMinimum.h:94
 FunctionMinimum.h:95
 FunctionMinimum.h:96
 FunctionMinimum.h:97
 FunctionMinimum.h:98
 FunctionMinimum.h:99
 FunctionMinimum.h:100
 FunctionMinimum.h:101
 FunctionMinimum.h:102
 FunctionMinimum.h:103
 FunctionMinimum.h:104
 FunctionMinimum.h:105
 FunctionMinimum.h:106
 FunctionMinimum.h:107
 FunctionMinimum.h:108
 FunctionMinimum.h:109
 FunctionMinimum.h:110
 FunctionMinimum.h:111
 FunctionMinimum.h:112
 FunctionMinimum.h:113
 FunctionMinimum.h:114