// This file is generated by WOK (CPPExt).
// Please do not edit this file; modify original file instead.
// The copyright and license terms as defined for the original file apply to 
// this header file considered to be the "object code" form of the original source.

#ifndef _math_BrentMinimum_HeaderFile
#define _math_BrentMinimum_HeaderFile

#include <Standard.hxx>
#include <Standard_DefineAlloc.hxx>
#include <Standard_Macro.hxx>

#include <Standard_Boolean.hxx>
#include <Standard_Real.hxx>
#include <Standard_Integer.hxx>
#include <Standard_OStream.hxx>
class StdFail_NotDone;
class math_Function;



//! This class implements the Brent's method to find the minimum of
//! a function of a single variable.
//! No knowledge of the derivative is required.
class math_BrentMinimum 
{
public:

  DEFINE_STANDARD_ALLOC

  

  //! This constructor should be used in a sub-class to initialize
  //! correctly all the fields of this class.
  Standard_EXPORT math_BrentMinimum(const Standard_Real TolX, const Standard_Integer NbIterations = 100, const Standard_Real ZEPS = 1.0e-12);
  

  //! This constructor should be used in a sub-class to initialize
  //! correctly all the fields of this class.
  //! It has to be used if F(Bx) is known.
  Standard_EXPORT math_BrentMinimum(const Standard_Real TolX, const Standard_Real Fbx, const Standard_Integer NbIterations = 100, const Standard_Real ZEPS = 1.0e-12);
  

  //! Given a bracketing triplet of abscissae Ax, Bx, Cx
  //! (such as Bx is between Ax and Cx, F(Bx) is
  //! less than both F(Bx) and F(Cx)) the Brent minimization is done
  //! on the function F.
  //! The tolerance required on F is given by Tolerance.
  //! The solution is found when :
  //! abs(Xi - Xi-1) <= TolX * abs(Xi) + ZEPS;
  //! The maximum number of iterations allowed is given by NbIterations.
  Standard_EXPORT math_BrentMinimum(math_Function& F, const Standard_Real Ax, const Standard_Real Bx, const Standard_Real Cx, const Standard_Real TolX, const Standard_Integer NbIterations = 100, const Standard_Real ZEPS = 1.0e-12);
  

  //! Brent minimization is performed on function F from a given
  //! bracketing triplet of abscissas Ax, Bx, Cx (such that Bx is
  //! between Ax and Cx, F(Bx) is less than both F(Bx) and F(Cx))
  //! Warning
  //! The initialization constructors must have been called
  //! before the call to the Perform method.
  Standard_EXPORT   void Perform (math_Function& F, const Standard_Real Ax, const Standard_Real Bx, const Standard_Real Cx) ;
  

  //! This method is called at the end of each iteration to check if the
  //! solution is found.
  //! It can be redefined in a sub-class to implement a specific test to
  //! stop the iterations.
  Standard_EXPORT virtual   Standard_Boolean IsSolutionReached (math_Function& F) ;
  
  //! Returns true if the computations are successful, otherwise returns false.
      Standard_Boolean IsDone()  const;
  
  //! returns the location value of the minimum.
  //! Exception NotDone is raised if the minimum was not found.
      Standard_Real Location()  const;
  
  //! returns the value of the minimum.
  //! Exception NotDone is raised if the minimum was not found.
      Standard_Real Minimum()  const;
  
  //! returns the number of iterations really done during the
  //! computation of the minimum.
  //! Exception NotDone is raised if the minimum was not found.
      Standard_Integer NbIterations()  const;
  
  //! Prints on the stream o information on the current state
  //! of the object.
  //! Is used to redefine the operator <<.
  Standard_EXPORT   void Dump (Standard_OStream& o)  const;




protected:



  Standard_Real a;
  Standard_Real b;
  Standard_Real x;
  Standard_Real fx;
  Standard_Real fv;
  Standard_Real fw;
  Standard_Real XTol;
  Standard_Real EPSZ;


private:



  Standard_Boolean Done;
  Standard_Integer iter;
  Standard_Integer Itermax;
  Standard_Boolean myF;


};


#include <math_BrentMinimum.lxx>





#endif // _math_BrentMinimum_HeaderFile
