```// Copyright (C) 2016  Davis E. King (davis@dlib.net)
#undef DLIB_fIND_OPTIMAL_PARAMETERS_ABSTRACT_Hh_
#ifdef DLIB_fIND_OPTIMAL_PARAMETERS_ABSTRACT_Hh_

#include "../matrix.h"

namespace dlib
{

// ----------------------------------------------------------------------------------------

template <
typename funct
>
double find_optimal_parameters (
double eps,
const unsigned int max_f_evals,
matrix<double,0,1>& x,
const matrix<double,0,1>& x_lower,
const matrix<double,0,1>& x_upper,
const funct& f
);
/*!
requires
- f(x) must be a valid expression that evaluates to a double
- x.size() == x_lower.size() == x_upper.size()
- x.size() > 0
- 0 < eps < initial_search_radius
- max_f_evals > 1
- min(x_upper - x_lower) > 0
- min(x - x_lower) >= 0 && min(x_upper - x) >= 0
(i.e. the given x should be within the bounds defined by x_lower and x_upper)
ensures
- Performs a constrained minimization of the function f() starting from
the initial point x.
- This function does not require derivatives of f().  Instead, it uses
derivative free methods to find the best setting of x.  In particular, it
will begin by searching within a sphere of radius initial_search_radius
around x and will continue searching until either f() has been called
max_f_evals times or the search area has been shrunk to less than eps radius.
- #x == the value of x (within the bounds defined by x_lower and x_upper) that
was found to minimize f().  More precisely, it will always be true that:
- min(#x - x_lower) >= 0 && min(x_upper - #x) >= 0
- returns f(#x).
throws
- No exception is thrown for executing max_f_evals iterations.  This function
will simply output the best x it has seen if it runs out of iterations.
!*/

// ----------------------------------------------------------------------------------------

}

#endif // DLIB_fIND_OPTIMAL_PARAMETERS_ABSTRACT_Hh_

```