// @(#)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_MnStrategy
#define ROOT_Minuit2_MnStrategy

namespace ROOT {

   namespace Minuit2 {

//_________________________________________________________________________
/**
    API class for defining three levels of strategies: low (0), medium (1),
    high (>=2);
    acts on: Migrad (behavioural),
             Minos (lowers strategy by 1 for Minos-own minimization),
             Hesse (iterations),
             Numerical2PDerivative (iterations)
 */

class MnStrategy {

public:

   //default strategy
   MnStrategy();

   //user defined strategy (0, 1, >=2)
   explicit MnStrategy(unsigned int);

   ~MnStrategy() {}

   unsigned int Strategy() const {return fStrategy;}

   unsigned int GradientNCycles() const {return fGradNCyc;}
   double GradientStepTolerance() const {return fGradTlrStp;}
   double GradientTolerance() const {return fGradTlr;}

   unsigned int HessianNCycles() const {return fHessNCyc;}
   double HessianStepTolerance() const {return fHessTlrStp;}
   double HessianG2Tolerance() const {return fHessTlrG2;}
   unsigned int HessianGradientNCycles() const {return fHessGradNCyc;}

   int StorageLevel() const { return fStoreLevel; }

   bool IsLow() const {return fStrategy == 0;}
   bool IsMedium() const {return fStrategy == 1;}
   bool IsHigh() const {return fStrategy >= 2;}

   void SetLowStrategy();
   void SetMediumStrategy();
   void SetHighStrategy();

   void SetGradientNCycles(unsigned int n) {fGradNCyc = n;}
   void SetGradientStepTolerance(double stp) {fGradTlrStp = stp;}
   void SetGradientTolerance(double toler) {fGradTlr = toler;}

   void SetHessianNCycles(unsigned int n) {fHessNCyc = n;}
   void SetHessianStepTolerance(double stp) {fHessTlrStp = stp;}
   void SetHessianG2Tolerance(double toler) {fHessTlrG2 = toler;}
   void SetHessianGradientNCycles(unsigned int n) {fHessGradNCyc = n;}

   // set storage level of iteration quantities
   // 0 = store only last iterations 1 = full storage (default)
   void SetStorageLevel(unsigned int level) { fStoreLevel = level; }
private:

   unsigned int fStrategy;

   unsigned int fGradNCyc;
   double fGradTlrStp;
   double fGradTlr;
   unsigned int fHessNCyc;
   double fHessTlrStp;
   double fHessTlrG2;
   unsigned int fHessGradNCyc;
   int fStoreLevel;
};

  }  // namespace Minuit2

}  // namespace ROOT

#endif  // ROOT_Minuit2_MnStrategy
 MnStrategy.h:1
 MnStrategy.h:2
 MnStrategy.h:3
 MnStrategy.h:4
 MnStrategy.h:5
 MnStrategy.h:6
 MnStrategy.h:7
 MnStrategy.h:8
 MnStrategy.h:9
 MnStrategy.h:10
 MnStrategy.h:11
 MnStrategy.h:12
 MnStrategy.h:13
 MnStrategy.h:14
 MnStrategy.h:15
 MnStrategy.h:16
 MnStrategy.h:17
 MnStrategy.h:18
 MnStrategy.h:19
 MnStrategy.h:20
 MnStrategy.h:21
 MnStrategy.h:22
 MnStrategy.h:23
 MnStrategy.h:24
 MnStrategy.h:25
 MnStrategy.h:26
 MnStrategy.h:27
 MnStrategy.h:28
 MnStrategy.h:29
 MnStrategy.h:30
 MnStrategy.h:31
 MnStrategy.h:32
 MnStrategy.h:33
 MnStrategy.h:34
 MnStrategy.h:35
 MnStrategy.h:36
 MnStrategy.h:37
 MnStrategy.h:38
 MnStrategy.h:39
 MnStrategy.h:40
 MnStrategy.h:41
 MnStrategy.h:42
 MnStrategy.h:43
 MnStrategy.h:44
 MnStrategy.h:45
 MnStrategy.h:46
 MnStrategy.h:47
 MnStrategy.h:48
 MnStrategy.h:49
 MnStrategy.h:50
 MnStrategy.h:51
 MnStrategy.h:52
 MnStrategy.h:53
 MnStrategy.h:54
 MnStrategy.h:55
 MnStrategy.h:56
 MnStrategy.h:57
 MnStrategy.h:58
 MnStrategy.h:59
 MnStrategy.h:60
 MnStrategy.h:61
 MnStrategy.h:62
 MnStrategy.h:63
 MnStrategy.h:64
 MnStrategy.h:65
 MnStrategy.h:66
 MnStrategy.h:67
 MnStrategy.h:68
 MnStrategy.h:69
 MnStrategy.h:70
 MnStrategy.h:71
 MnStrategy.h:72
 MnStrategy.h:73
 MnStrategy.h:74
 MnStrategy.h:75
 MnStrategy.h:76
 MnStrategy.h:77
 MnStrategy.h:78
 MnStrategy.h:79
 MnStrategy.h:80
 MnStrategy.h:81
 MnStrategy.h:82
 MnStrategy.h:83
 MnStrategy.h:84
 MnStrategy.h:85
 MnStrategy.h:86
 MnStrategy.h:87
 MnStrategy.h:88
 MnStrategy.h:89
 MnStrategy.h:90