00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef ROOT_Minuit2_BasicMinimumState
00011 #define ROOT_Minuit2_BasicMinimumState
00012
00013 #include "Minuit2/MinimumParameters.h"
00014 #include "Minuit2/MinimumError.h"
00015 #include "Minuit2/FunctionGradient.h"
00016
00017 #include "Minuit2/StackAllocator.h"
00018
00019 namespace ROOT {
00020
00021 namespace Minuit2 {
00022
00023
00024
00025
00026 class BasicMinimumState {
00027
00028 public:
00029
00030 BasicMinimumState(unsigned int n) :
00031 fParameters(MinimumParameters(n)), fError(MinimumError(n)),
00032 fGradient(FunctionGradient(n)), fEDM(0.), fNFcn(0) {}
00033 BasicMinimumState(const MinimumParameters& states, const MinimumError& err,
00034 const FunctionGradient& grad, double edm, int nfcn) :
00035 fParameters(states), fError(err), fGradient(grad), fEDM(edm), fNFcn(nfcn) {}
00036
00037 BasicMinimumState(const MinimumParameters& states, double edm, int nfcn) : fParameters(states), fError(MinimumError(states.Vec().size())), fGradient(FunctionGradient(states.Vec().size())), fEDM(edm), fNFcn(nfcn) {}
00038
00039 ~BasicMinimumState() {}
00040
00041 BasicMinimumState(const BasicMinimumState& state) :
00042 fParameters(state.fParameters), fError(state.fError), fGradient(state.fGradient), fEDM(state.fEDM), fNFcn(state.fNFcn) {}
00043
00044 BasicMinimumState& operator=(const BasicMinimumState& state) {
00045 fParameters = state.fParameters;
00046 fError = state.fError;
00047 fGradient = state.fGradient;
00048 fEDM = state.fEDM;
00049 fNFcn = state.fNFcn;
00050 return *this;
00051 }
00052
00053 void* operator new(size_t nbytes) {
00054 return StackAllocatorHolder::Get().Allocate(nbytes);
00055 }
00056
00057 void operator delete(void* p, size_t ) {
00058 StackAllocatorHolder::Get().Deallocate(p);
00059 }
00060
00061 const MinimumParameters& Parameters() const {return fParameters;}
00062 const MnAlgebraicVector& Vec() const {return fParameters.Vec();}
00063 int size() const {return fParameters.Vec().size();}
00064
00065 const MinimumError& Error() const {return fError;}
00066 const FunctionGradient& Gradient() const {return fGradient;}
00067 double Fval() const {return fParameters.Fval();}
00068 double Edm() const {return fEDM;}
00069 int NFcn() const {return fNFcn;}
00070
00071 bool IsValid() const {
00072 if(HasParameters() && HasCovariance())
00073 return Parameters().IsValid() && Error().IsValid();
00074 else if(HasParameters()) return Parameters().IsValid();
00075 else return false;
00076 }
00077 bool HasParameters() const {return fParameters.IsValid();}
00078 bool HasCovariance() const {return fError.IsAvailable();}
00079
00080 private:
00081
00082 MinimumParameters fParameters;
00083 MinimumError fError;
00084 FunctionGradient fGradient;
00085 double fEDM;
00086 int fNFcn;
00087 };
00088
00089 }
00090
00091 }
00092
00093 #endif // ROOT_Minuit2_BasicMinimumState