26#ifndef UTILS_ALGO_BRACKET_dot_HH
27#define UTILS_ALGO_BRACKET_dot_HH
82 template <
typename Real>
91 virtual Real
eval( Real x )
const = 0;
101 #ifndef DOXYGEN_SHOULD_SKIP_THIS
102 template <
typename Real,
typename PFUN>
103 class Bracket_fun :
public Bracket_base_fun<Real> {
106 explicit Bracket_fun( PFUN pfun ) : m_fun(pfun) {}
107 Real eval( Real x )
const override {
return m_fun(x); };
273 template <
typename Real>
276 using Method =
enum class Method :
unsigned {
277 BISECTION=0, ILLINOIS, CHANDRUPATLA, BRENT, RIDDER, MODIFIED_AB, ALGO748
284 bool m_converged{
false };
286 Real m_a{0}, m_fa{0};
287 Real m_b{0}, m_fb{0};
288 Method m_select{Method::CHANDRUPATLA};
292 Integer m_max_fun_evaluation{1000};
293 Integer m_max_iteration{200};
295 mutable Integer m_iteration_count{0};
296 mutable Integer m_fun_evaluation_count{0};
298 Real evaluate( Real x ) { ++m_fun_evaluation_count;
return m_function->
eval(x); };
301 Real eval( Real
a, Real
b );
302 Real eval( Real
a, Real
b, Real amin, Real bmax );
304 Real p_zero2( Real d, Real fd )
const;
305 Real invp_zero2( Real d, Real fd )
const;
306 Real invp_zero3( Real d, Real fd, Real e, Real fe )
const;
315 : m_tolerance_x( tol_x ), m_tolerance_f( tol_f )
329 return this->eval(
a,
b );
345 return this->eval(
a,
b, amin, bmax );
356 template <
typename PFUN>
359 Bracket_fun<Real,PFUN> fun( pfun );
361 return this->eval(
a,
b );
374 template <
typename PFUN>
376 eval2( Real
a, Real
b, Real amin, Real bmax, PFUN pfun ) {
377 Bracket_fun<Real,PFUN> fun( pfun );
379 return this->eval(
a,
b, amin, bmax );
392 template <
typename PFUN>
395 Bracket_fun<Real,PFUN> fun( pfun );
397 m_iteration_count = 0;
398 m_fun_evaluation_count = 0;
443 Real
a()
const {
return m_a; }
444 Real
b()
const {
return m_b; }
445 Real
fa()
const {
return m_fa; }
446 Real
fb()
const {
return m_fb; }
449 switch ( m_select ) {
450 case Method::BISECTION:
return "bisection";
break;
451 case Method::ILLINOIS:
return "illinois";
break;
452 case Method::CHANDRUPATLA:
return "Chandrupatla";
break;
453 case Method::BRENT:
return "Brent";
break;
454 case Method::RIDDER:
return "Ridder";
break;
455 case Method::MODIFIED_AB:
return "modified_AB";
break;
456 case Method::ALGO748:
return "algo748";
break;
463 case 0: m_select = Method::BISECTION;
break;
464 case 1: m_select = Method::ILLINOIS;
break;
465 case 2: m_select = Method::CHANDRUPATLA;
break;
466 case 3: m_select = Method::BRENT;
break;
467 case 4: m_select = Method::RIDDER;
break;
468 case 5: m_select = Method::MODIFIED_AB;
break;
469 case 6: m_select = Method::ALGO748;
break;
475 #ifndef UTILS_OS_WINDOWS
476 extern template class AlgoBracket<float>;
477 extern template class AlgoBracket<double>;
void set_max_fun_evaluation(Integer mfev)
Definition Utils_AlgoBracket.cc:74
Real eval2(Real a, Real b, PFUN pfun)
Definition Utils_AlgoBracket.hh:358
Real eval2(Real a, Real b, Real amin, Real bmax, PFUN pfun)
Definition Utils_AlgoBracket.hh:376
Real tolerance_f() const
Definition Utils_AlgoBracket.hh:436
AlgoBracket(Real tol_x, Real tol_f)
Definition Utils_AlgoBracket.hh:314
Real eval(Real a, Real b, Real amin, Real bmax, Bracket_base_fun< Real > *fun)
Definition Utils_AlgoBracket.hh:343
Real a() const
Definition Utils_AlgoBracket.hh:443
Integer num_fun_eval() const
Definition Utils_AlgoBracket.hh:426
void set_max_iterations(Integer mit)
Definition Utils_AlgoBracket.cc:60
bool converged() const
Definition Utils_AlgoBracket.hh:441
Real b() const
Definition Utils_AlgoBracket.hh:444
Real fa() const
Definition Utils_AlgoBracket.hh:445
Real tolerance_x() const
Definition Utils_AlgoBracket.hh:431
Real eval3(Real a, Real b, Real fa, Real fb, PFUN pfun)
Definition Utils_AlgoBracket.hh:394
Real fb() const
Definition Utils_AlgoBracket.hh:446
Integer used_iter() const
Definition Utils_AlgoBracket.hh:421
string algo() const
Definition Utils_AlgoBracket.hh:448
Real eval(Real a, Real b, Bracket_base_fun< Real > *fun)
Definition Utils_AlgoBracket.hh:327
void select(unsigned i_algo)
Definition Utils_AlgoBracket.hh:461
Abstract base class for defining mathematical functions used in the Bracket search algorithm.
Definition Utils_AlgoBracket.hh:83
Real operator()(Real x) const
Definition Utils_AlgoBracket.hh:98
virtual Real eval(Real x) const =0
Definition SystemUtils.cc:39